首页 > 代码库 > 11_Shell语言———管道详解

11_Shell语言———管道详解

管道的基本用法为:

COMMAND1 | COMMAND2 | COMMAND3 | ...

COMMAND1 的输出结果会作为输入参数传递给COMMAND2COMMAND2加以处理后会传递给COMMAND3, 依此类推。管道的使用便是Linux哲学思想中“组合小程序完成复杂任务”的体现方式。

如果管道的最后一个命令是在当前shell的子shell中执行,那么该执行结果不能保存为一个变量,这样会导致当前shell无法获取执行结果,这是由shell中“本地变量只对当前shell的进程有效”的特性决定的。


下面来举几个例子演示管道的具体的用法:

1. 命令 ifconfig可以用来查看当前系统中所有处于活动状态的网络接口,其中包括当前系统所使用的IP地址。通过该IP地址,远程客户端也可以访问当前的系统。

wKiom1NyKIXSdYX6AAkxnGvaewU412.jpg


如果想找到远程系统的IP地址(非127.0.0.1——localhost),就可以使用管道:

# ifconfig | grep inet addr: | grep -v 127.0.0.1 | cut -d: -f2 | cut -d -f1

wKiom1NyKinCatfAAAiSj0AeTKU113.jpg

这个例子中一共使用了四次管道,这就是组合小程序完成复杂功能的体现。


2. 如果要取出当前系统上所有用户的shell,要求每种shell只显示一次,并且按使用次数由大到小的顺序进行显示,可以进行以下操作:

# cut -d: f7 /etc/passwd | sort | grep -v ^$ | uniq -c | sort -n

wKiom1NyKniCtmfUAAGbbXiJjTU529.jpg


3. 如果要取出 /etc/inittab文件中的第五行,可以进行以下操作:

# head -5 /etc/inittab | tail -1

wKioL1NyKnujAvTuAAIr2ps4udM173.jpg


管道中的值也可以保存为变量。例如要将 /usr/bin中的文件个数以“/usr/bin has N files.”的形式显示出来,就可以使用以下命令:

# FILES=ls /usr/bin | wc -l

# echo /usr/bin has $FILES files.

wKiom1NyKsjyCOEmAADcW1XmKf8681.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

wKioL1NyKveyVeKgAAJL2ET-kqg784.jpg

由这个例子可以看到,使用了管道就不能使用重定向,反之亦然。如果想在命令中同时使用管道和重定向,那么应该怎么操作呢?

Linux中有个命令为tee,可以即保存命令到管道中,又实现重定向,比如还是上述例子:

# cat /etc/rc.d/rc.sysinit | tee /tmp/tee.out// 可以看到屏幕上出现了cat的结果

# cat /tmp/tee.out// 同时也能看到/tmp/tee.out中也有结果

wKioL1NyKynwx-glAAG-oVgnhvU448.jpg

由这个例子可以看出,tee命令实际上是一个进口,两个出口,和字母“T”的形状相似。

使用了tee命令,也可以将其结果再次送入管道:

# cat /etc/rc.d/rc.sysinit | tee /tmp/tee.out | less  // cat的内容由tee保存后再进行分页查看

wKiom1NyK3WikVEjAAGDuVvDp40159.jpg


再比如要取出/etc/passwd文件中倒数第9个用户的用户名和shell,显示到屏幕上并将其保存至/tmp/users.out文件中:

# tail -9 /etc/passwd | head -1 | cut -d: -f1,7 | tee /tmp/users.out

wKioL1NyK3mSzk1EAAGDuVvDp40539.jpg


本文出自 “重剑无锋 大巧不工” 博客,请务必保留此出处http://wuyelan.blog.51cto.com/6118147/1410773