许多Linux命令具有过滤特性,即一条命令通过标准输入端口接收一个文件中的数据,命令执行后产生的结果数据又通过标准输出端口送给后一条命令,作为该命令的输入数据。后一条命令也是通过标准输入端口接收输入数据。
shell提供管道命令“|”将这些命令前后衔接在一起,形成一个管道线。格式为
命令1|命令2|...|命令n
管道线中的每一条命令都作为一个单独的进程运行,每一条命令的输出作为下一条命令的输入。由于管道线中的命令总是从左到右顺序执行的,所以管道线是单向的。
管道线实现了创建Linux系统管道文件并进行重定向,但是管道不同于I/O重定向,输入重定向导致一个程序的标准输入来自某个文件,输出重定向是将一个程序的标准输出写到一个文件中,而管道是直接将一个程序的标准输出与另一个程序的标准输入相连接,不需要经过任何中间文件。
例如:
$who >tmpfile
运行命令who来找出谁已经登录进入系统。该命令的输出结果是每个用户对应一行数据,其中包含了一些有用的信息,将这些信息保存在临时文件中。
运行下面的命令:
$ wc -l <tmpfile
该命令会统计临时文件的行数,最后的结果是登录进入系统中的用户人数。
可以将以上两个命令组合起来。
$ who|wc -l
管道符号告诉命令解释程序将左边的命令(在本例中为who)的标准输出流连接到右边的命令(在本例中为wc -l)的标准输入流。现在命令who的输出不经过临时文件就可以直接送到命令wc-l中了。
如果标准错误输出未重定向,那么任何写入其中的信息都会在终端屏幕上显示。管道可用来连接两个以上的命令。由于使用了一种被称为过滤器的服务程序,多级管道在Linux中是很普遍的。过滤器只是一段程序,它从自己的标准输入流读入数据,然后写到自己的标准输出流中,这样就能沿着管道过滤数据。例如:
$who|grep ttyp|wc-l