在 Bash 中,管道符使用"丨"代表。管道符也是用来连接多条命令的,如"命令1丨命令2"。不过和多命令顺序执行不同的是,用管道符连接的命令,命令 1 的正确输出作为命令 2 的操作对象。这里需要注意,命令 1 必须有正确输出,而命令 2 必须可以处理命令 1 的输出结果;而且命令 2 只能处理命令 1 的正确输出,而不能处理错误输出。
举个例子,我们经常需要使用"||"命令査看文件的长格式,不过在有些目录中文件众多,比如 /etc/ 目录,使用"ll"命令显示的内容就会非常多,只能看到最后的内容,而不能看到前面输出的内容。
这时,我们马上想到 more 命令可以分屏显示文件内容,可是怎么让 more 命令分屏显示命令的输出呢?我想到了一种笨办法:
[root@localhost ~]# ll -a /etc/ > /root/testfile
#用输出重定向,把ll命令的输出保存到/root/testfile 文件中
[root@localhost ~]# more /root/testfile
#既然testfile是文件,当然可以用more命令分屏显示了
总用量1784
drwxr-xr-x. 105 root root 1228810月 21 12:49. dr-xr-xr-x. 26 root root 4096 6月519:06..
…省略部分输出…
-rwxr-xr-x. 1 root root 687 6月 22 2012 auto.smb --More--(7%)
可是这样操作实在不方便,这时就可以利用管道符了。命令如下:
[root@localhost ~]# ll -a /etc/|more
这条命令大家可以这样理解:先把"ll -a /etc"命令 的输出保存到某个临时文件中,再用 more 命令处理这个文件。也就是我们说的第一个命令的正确输出是第二条命令处理和操作的对象。
注意,ll 命令操作的是文件名,所以匹配时使用的是通配符。但是一旦加入管道符,管道符之后的内容相当于操作的是文件内容,所以匹配时使用的是正则表达式。
关于管道符,我们再举几个例子:
[root@localhost ~]# netstat -an | grep "ESTABLISHED"
#查询一下本地所有网络连接,提取包含 ESTABLISHED(已建立连接)的行
#就可以知道我们的服务器上有多少已经成功连接的网络连接
[root@localhost ~]# netstat -an | grep "ESTABLISHED" | wc-l
#如果想知道具体的网络连接数量,就可以再使用wc命令统计行数