linux命令行学习(16):管道(pipeline)


一、管道及使用

管道是一种shell特性。命令从标准输入读取数据,并将数据发送到标准输出的能力,就是管道特性。

使用管道操作符“I”(竖线)可以把一个命令的标准输出传送到另一个命令的标准输入中。具体格式如下:

Command 1 I command2 ...

可以用多个|联结多条命令。

不同命令使用管道相联结,可以实现很多功能。

以下举例叙述。

二、用管道功能分页输出命令结果

less命令可以接受标准输入,因此可以用less命令接受任意命令的输出,并发送到标准输出。因此可以用来验证管道功能。

由于less命令是分布输出的,这样就可以实现任何命令结果的分页输出。否则,有的命令输出很多,我们就看不到前面的输出了。

例如:

$ Is -l /usr/bin | less

会分页显示Is -l /usr/bin的输出。当Is -l /usr/bin的输出很多时,这样做就是必要的,除非我们对命令结果不关心。

注意,这时,用回车是一行一行地显示,而用翻页键可以一页一页地翻。page up是向前翻,page down是向后翻。

这个例子中,使用管道联结了两个命令。

三、使用管道输出排序后的结果

假设要把/bin和/usr/bin目录下的所有可执行程序合并成一个列表,并且按照顺序排列,最后再查看这个列表。

$ Is /bin /usr/bin | sort | less

由于我们指定了两个目录(/bin和/usr/bin) , Is的输出将包含两个排好序的列表,每个对应一个目 录。

通过在管道中包含sort命令,我们改变输出数据,从而产生一个排好序的列表。

这个例子,使用管道联结了三个命令。

四、删除输出中的重复行

将ls的输出先排序,然后删除重复行,再分页显示:

$ Is /bin /usr/bin | sort | uniq | less

这个例子,使用管道联结了四个命令。

五、显示输出的行数

查看已排好序的列表中的条目数:

$ Is /bin /usr/bin | sort | uniq | wc -l

ls的输出,被sort排序,再用uniq删除重复行,之后用wc计算出行数。wc的选项-l使得只报告行数(l为line的首字母)。

这个例子,使用管道联结了四个命令,其中wc使用了选项。这个例子说明,被联结的命令可以使用操作对象(此例中的ls)和选项(此例中的wc)。

六、显示指定的文件

在用管道联结grep命令,可以实现显示指定的文件的功能。

例如,要显示目录/bin和/usr/bin中文件名中包含zip的文件,则可以像下面这样:

$Is /bin /usr/bin | sort | uniq | grep zip

这个例子,使用管道联结了四个命令,其中grep使用了选项。

七、显示输出的前后部分

显示输出的前面5行:

$ Is /usr/bin | head -n 5

显示输出的后面5行:

$ Is /usr/bin | tail -n 5

八、将tee命令用在管道中

tee命令,它接收标准输入并输出到标准输出中去。tee命令最好用在管道中。这样,它接收前面命令的输出,并向下传送。看下面的例子:

$ Is /usr/bin | tee ls.txt | grep zip

ls的输出结果被送到tee,其将它复制到ls.txt中,同时送给grep作为输入。因此上面的由管道联结的命令组将/usr/bin的文件信息复制到文件ls.txt中,同时将其中含有zip的行显示在屏幕上。

推荐阅读更多精彩内容