D24

Shell还有一种功能,就是可以将两个或多个程序连接到一起,以使一个程序的输出变为下一个程序的输入,以这种方式连接的两个或多个程序就形成了管道。管道通常用于执行一些复杂的数据处理操作。这些命令之间使用控制操作符(管道符)|(竖线)连接。

语法:

$ command1 | command2
$ command1 | command2 [ | commandN... ]

当在两个命令之间设置管道时,管道符左边命令的标准输出就变为了管道符右边命令的标准输入。只要第一个命令向标准输出写入,而第二个命令从标准输入读取,那么这两个命令就形成一个管道。大部分Linux命令都可以用来形成管道。

 

1. 操作符|和>之间的区别

重定向符>将命令与文件连接,而管道符|将第一个命令的输出与第二个命令的输入连接。

$ command1 > file1
$ command1 | command2

注意:二者不能混用

 

2. 为什么使用管道

使用管道的命令有如下特点:

命令的语法紧凑并且使用简单;

通过使用管道,将多个命令串联来完成复杂任务;

从管道输出的标准错误会混合到一起。

 

3. 使用管道连接程序

示例:

#将cat命令的输出每次按照一个屏幕的长度显示,对于查看长度大于一个屏幕的文件很有效
$ cat /var/log/messages | less 

#查看指定程序的进程运行状态,并将输出重定向到文件中
$ ps aux |grep httpd > ps.output

#显示按用户名排序后的当前登录系统的用户的信息
$ who | sort

#统计系统当前登录的用户数
$ who | wc -l

#查看指定的用户是否登录
$ who | grep user1

#查看系统中安装的glibc包的版本
$ rpm -qa | grep glibc

#以较为易读的形式显示系统中挂载的文件系统的信息
$ mount | column -t

#将账户的主目录被分到远程的备份服务器
#tar进行压缩;将压缩后的内容作为输入传给ssh命令,再通过cat命令将接收到的内容重定向输出到指定文件
$ tar czvf - /home/user1 | ssh user@remoteserver "cat > /tmp/home_user1.`date +%Y%m%d`.tgz"

#将一个列表文件中的内容转换为一行
$ cat list.txt 
ab dde
ab   dde


abde
333
a
$ cat list.txt | tr '\n' ' ' | xargs
ab dde ab dde abde 333 a

#将一个目录的内容创建为一个光盘镜像文件,然后刻录此镜像文件
$ mkisofs -V Photos -r /home/user1/photos | cdrecored -V dev=/dev/dvdrw -

#生成一个7位随机的密码
$ tr -dc A-Za-z0-9_ < /dev/urandom | head -c7 | xargs

 

4. 管道中的输入重定向

输入重定向操作符<可以在管道中使用,以用来从文件中获取输入。

$ cat os.txt 
redhat
suse
centos
ubuntu
solaris

$ tr a-z A-Z < os.txt | sort #用tr命令从os.txt中获取输入,然后通过管道将输出发送给sort命令
CENTOS
REDHAT
SOLARIS
SUSE
UBUNTU

 

5. 管道中的输出重定向

可以使用重定向操作符>或>>将管道中最后一个命令的标准输出进行重定向。

语法:

$ command1 | command2 | ... | commandN > output.txt
$ command1 < input.txt | command2 | ... | commandN > output.txt

示例:

#使用mount命令显示当前挂载的文件系统的信息,并用column命令格式化列的输出,最后将输出结果保存到文件中
$ mount | column -t > mounted.list

#使用who命令查看系统当前登录的用户,并用sort命令将输出按账户名排序,最后输出重定向到指定文件中
$ who | sort > user.list 

#使用tr命令将os.txt文件内容转化为大写,并用sort命令将内容排序,用uniq命令去除重复的行,最后输出重定向到文件os.txt.new
$ cat os.txt 
redhat
suse
centos
ubuntu
solaris
centos
suse

$ tr a-z A-Z < os.txt | sort | uniq > os.txt.new

$ cat os.txt.new 
CENTOS
REDHAT
SOLARIS
SUSE
UBUNTU