管道的基本用法为:
COMMAND1 | COMMAND2 | COMMAND3 | ...
COMMAND1 的输出结果会作为输入参数传递给COMMAND2, COMMAND2加以处理后会传递给COMMAND3, 依此类推。管道的使用便是Linux哲学思想中“组合小程序完成复杂任务”的体现方式。
如果管道的最后一个命令是在当前shell的子shell中执行,那么该执行结果不能保存为一个变量,这样会导致当前shell无法获取执行结果,这是由shell中“本地变量只对当前shell的进程有效”的特性决定的。
下面来举几个例子演示管道的具体的用法:
例1. 命令 ifconfig可以用来查看当前系统中所有处于活动状态的网络接口,其中包括当前系统所使用的IP地址。通过该IP地址,远程客户端也可以访问当前的系统。
如果想找到远程系统的IP地址(非127.0.0.1——localhost),就可以使用管道:
# ifconfig | grep “inet addr:” | grep -v ‘127.0.0.1’ | cut -d: -f2 | cut -d‘’ -f1
这个例子中一共使用了四次管道,这就是组合小程序完成复杂功能的体现。
例2. 如果要取出当前系统上所有用户的shell,要求每种shell只显示一次,并且按使用次数由大到小的顺序进行显示,可以进行以下操作:
# cut -d: f7 /etc/passwd | sort | grep -v “^$” | uniq -c | sort -n
例3. 如果要取出 /etc/inittab文件中的第五行,可以进行以下操作:
# head -5 /etc/inittab | tail -1
管道中的值也可以保存为变量。例如要将 /usr/bin中的文件个数以“/usr/bin has N files.”的形式显示出来,就可以使用以下命令:
# FILES=’ls /usr/bin | wc -l’
# echo “/usr/bin has $FILES files.”
管道和重定向同时使用(多道输出 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
由这个例子可以看到,使用了管道就不能使用重定向,反之亦然。如果想在命令中同时使用管道和重定向,那么应该怎么操作呢?
在Linux中有个命令为tee,可以即保存命令到管道中,又实现重定向,比如还是上述例子:
# cat /etc/rc.d/rc.sysinit | tee /tmp/tee.out// 可以看到屏幕上出现了cat的结果
# cat /tmp/tee.out// 同时也能看到/tmp/tee.out中也有结果
由这个例子可以看出,tee命令实际上是一个进口,两个出口,和字母“T”的形状相似。
使用了tee命令,也可以将其结果再次送入管道:
# cat /etc/rc.d/rc.sysinit | tee /tmp/tee.out | less // cat的内容由tee保存后再进行分页查看
再比如要取出/etc/passwd文件中倒数第9个用户的用户名和shell,显示到屏幕上并将其保存至/tmp/users.out文件中:
# tail -9 /etc/passwd | head -1 | cut -d: -f1,7 | tee /tmp/users.out
本文出自 “重剑无锋 大巧不工” 博客,请务必保留此出处http://wuyelan.blog.51cto.com/6118147/1410773
11_Shell语言———管道详解,布布扣,bubuko.com
原文:http://wuyelan.blog.51cto.com/6118147/1410773