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
本节结束