原理

一个命令的输出是另一个命令的输入,另一个命令的输出是下一个命令的输入,以此形成一条管道。其中命令的输出需要是标准输出,若是错误输出,则从此处跳出来。
管道操作符号”|”
格式:cmd1 | cmd2 [… | cmdn]
| 连接左右两个命令,将左侧命令的标准输出,作为右侧命令的标准输入
head -5 /etc/passwd | tail -1实现如下:
1)head -5 /etc/passwd得到/etc/passwd文件的前5行
[root@kedacom test]# head -5 /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
2)将输出的5行作为tail -1的输入,取得最后一行
[root@kedacom test]# head -5 /etc/passwd | tail -1lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
管道特别说明
1. 在管道后面的命令都不应该再跟文件名
#正确管道使用[root@kedacom test]# head -5 /etc/passwd | tail -1lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin#错误管道使用[root@kedacom test]# head -5 /etc/passwd | tail -1 /etc/passwddevupdate:x:1005:50::/var/nms/devversion:/bin/bash
2. 在管道中只有标准输出才传递给下一个命令,标准错误输出直接输出到终端
[kedacom@kedacom ~]$ find /etc/ -name "*.conf" | grep rcfind: ‘/etc/grub.d’: 权限不够find: ‘/etc/selinux/targeted/active’: 权限不够find: ‘/etc/selinux/final’: 权限不够find: ‘/etc/pki/CA/private’: 权限不够find: ‘/etc/pki/rsyslog’: 权限不够find: ‘/etc/lvm/archive’: 权限不够find: ‘/etc/lvm/backup’: 权限不够find: ‘/etc/lvm/cache’: 权限不够find: ‘/etc/polkit-1/rules.d’: 权限不够find: ‘/etc/polkit-1/localauthority’: 权限不够find: ‘/etc/ntp/crypto’: 权限不够find: ‘/etc/nginx/client_body_temp’: 权限不够find: ‘/etc/nginx/proxy_temp’: 权限不够find: ‘/etc/nginx/fastcgi_temp’: 权限不够find: ‘/etc/nginx/uwsgi_temp’: 权限不够find: ‘/etc/nginx/scgi_temp’: 权限不够/etc/libreport/events.d/vimrc_event.conf
若不想将错误输出到屏幕中,可将错误重定向到空设备中
[kedacom@kedacom ~]$ find /etc/ -name "*.conf" 2> /dev/null| grep rc/etc/libreport/events.d/vimrc_event.conf
3. 有些命令是不支持管道技术的
[kedacom@kedacom ~]$ which cat/usr/bin/cat[kedacom@kedacom ~]$ ll /usr/bin/cat-rwxr-xr-x. 1 root root 54160 2月 25 2019 /usr/bin/cat#将which cat输出作为ls -l的输入#实际ls -l输出的是当前目录的文件,并未实现管道技术[kedacom@kedacom ~]$ which cat | ls -l总用量 650348-rw-r--r-- 1 kedacom root 6053 1月 31 21:58 all-rw-r--r-- 1 root root 19555 12月 31 13:32 choujian1.log-rw-r--r-- 1 root root 1204176 12月 31 11:13 choujian_per.log-rw-r--r-- 1 kedacom root 745 1月 31 21:54 error-rw-r--r-- 1 root root 43254688 10月 18 17:31 iau-rw-r--r-- 1 kedacom root 5308 1月 31 21:54 out-rw-r--r-- 1 root root 131447710 12月 23 12:21 slave_exe_install.tar-rw-r--r-- 1 root root 431057610 12月 23 12:21 spot_check_system.tar-rw-r--r-- 1 tcpdump tcpdump 58942461 4月 16 2021 tsu.pcap
ls命令不支持管道技术,若需要让不支持管道技术的命令实现管道技术,可以使用xargs
[kedacom@kedacom ~]$ which cat | xargs ls -l-rwxr-xr-x. 1 root root 54160 2月 25 2019 /usr/bin/cat
xargs说明
用途:将参数列表转换成小块分段传递给其他命令
读入stdin的数据转换为参数添加到命令行中
让一些不支持管道的命令可以使用管道
