设为首页 收藏本站
查看: 1016|回复: 0

11_Shell语言———管道详解

[复制链接]
发表于 2018-8-30 08:21:45 | 显示全部楼层 |阅读模式
  管道的基本用法为:
  COMMAND1 | COMMAND2 | COMMAND3 | ...
  COMMAND1 的输出结果会作为输入参数传递给COMMAND2, COMMAND2加以处理后会传递给COMMAND3, 依此类推。管道的使用便是Linux哲学思想中“组合小程序完成复杂任务”的体现方式。
  如果管道的最后一个命令是在当前shell的子shell中执行,那么该执行结果不能保存为一个变量,这样会导致当前shell无法获取执行结果,这是由shell中“本地变量只对当前shell的进程有效”的特性决定的。
  下面来举几个例子演示管道的具体的用法:
  例1. 命令 ifconfig可以用来查看当前系统中所有处于活动状态的网络接口,其中包括当前系统所使用的IP地址。通过该IP地址,远程客户端也可以访问当前的系统。
DSC0000.jpg

  如果想找到远程系统的IP地址(非127.0.0.1——localhost),就可以使用管道:
  # ifconfig | grep “inet addr:” | grep -v ‘127.0.0.1’ | cut -d: -f2 | cut -d‘’ -f1
DSC0001.jpg

  这个例子中一共使用了四次管道,这就是组合小程序完成复杂功能的体现。
  例2. 如果要取出当前系统上所有用户的shell,要求每种shell只显示一次,并且按使用次数由大到小的顺序进行显示,可以进行以下操作:
  # cut -d: f7 /etc/passwd | sort | grep -v “^$” | uniq -c | sort -n
DSC0002.jpg

  例3. 如果要取出 /etc/inittab文件中的第五行,可以进行以下操作:
  # head -5 /etc/inittab | tail -1
DSC0003.jpg

  管道中的值也可以保存为变量。例如要将 /usr/bin中的文件个数以“/usr/bin has N files.”的形式显示出来,就可以使用以下命令:
  # FILES=’ls /usr/bin | wc -l’
  # echo “/usr/bin has $FILES files.”
DSC0004.jpg

  管道和重定向同时使用(多道输出 tee):
  多道输出的格式为:
  COMMAND1 | tee /Path/To/Somefile
  首先来看一个例子:
  # cat /etc/rc.d/rc.sysinit | less
  # cat /etc/rc.d/rc,sysinit > /tmp/pipe.out
  # cat /tmp/pipe.out
DSC0005.jpg

  由这个例子可以看到,使用了管道就不能使用重定向,反之亦然。如果想在命令中同时使用管道和重定向,那么应该怎么操作呢?
  在Linux中有个命令为tee,可以即保存命令到管道中,又实现重定向,比如还是上述例子:
  # cat /etc/rc.d/rc.sysinit | tee /tmp/tee.out// 可以看到屏幕上出现了cat的结果
  # cat /tmp/tee.out// 同时也能看到/tmp/tee.out中也有结果
DSC0006.jpg

  由这个例子可以看出,tee命令实际上是一个进口,两个出口,和字母“T”的形状相似。
  使用了tee命令,也可以将其结果再次送入管道:
  # cat /etc/rc.d/rc.sysinit | tee /tmp/tee.out | less  // cat的内容由tee保存后再进行分页查看
DSC0007.jpg

  再比如要取出/etc/passwd文件中倒数第9个用户的用户名和shell,显示到屏幕上并将其保存至/tmp/users.out文件中:
  # tail -9 /etc/passwd | head -1 | cut -d: -f1,7 | tee /tmp/users.out
DSC0008.jpg



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-558678-1-1.html 上篇帖子: Linux基础知识——shell命令类型及命令使用帮助 下篇帖子: 转——[Shell学习笔记] Shell正则表达式与grep、sed、awk的特点
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表