原理

管道技术 - 图1
一个命令的输出是另一个命令的输入,另一个命令的输出是下一个命令的输入,以此形成一条管道。其中命令的输出需要是标准输出,若是错误输出,则从此处跳出来。

管道操作符号”|”

格式:cmd1 | cmd2 [… | cmdn]
| 连接左右两个命令,将左侧命令的标准输出,作为右侧命令的标准输入
head -5 /etc/passwd | tail -1实现如下:
1)head -5 /etc/passwd得到/etc/passwd文件的前5行

  1. [root@kedacom test]# head -5 /etc/passwd
  2. root:x:0:0:root:/root:/bin/bash
  3. bin:x:1:1:bin:/bin:/sbin/nologin
  4. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  5. adm:x:3:4:adm:/var/adm:/sbin/nologin
  6. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

2)将输出的5行作为tail -1的输入,取得最后一行

  1. [root@kedacom test]# head -5 /etc/passwd | tail -1
  2. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

管道特别说明

1. 在管道后面的命令都不应该再跟文件名

  1. #正确管道使用
  2. [root@kedacom test]# head -5 /etc/passwd | tail -1
  3. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  4. #错误管道使用
  5. [root@kedacom test]# head -5 /etc/passwd | tail -1 /etc/passwd
  6. devupdate:x:1005:50::/var/nms/devversion:/bin/bash

2. 在管道中只有标准输出才传递给下一个命令,标准错误输出直接输出到终端

  1. [kedacom@kedacom ~]$ find /etc/ -name "*.conf" | grep rc
  2. find: ‘/etc/grub.d’: 权限不够
  3. find: ‘/etc/selinux/targeted/active’: 权限不够
  4. find: ‘/etc/selinux/final’: 权限不够
  5. find: ‘/etc/pki/CA/private’: 权限不够
  6. find: ‘/etc/pki/rsyslog’: 权限不够
  7. find: ‘/etc/lvm/archive’: 权限不够
  8. find: ‘/etc/lvm/backup’: 权限不够
  9. find: ‘/etc/lvm/cache’: 权限不够
  10. find: ‘/etc/polkit-1/rules.d’: 权限不够
  11. find: ‘/etc/polkit-1/localauthority’: 权限不够
  12. find: ‘/etc/ntp/crypto’: 权限不够
  13. find: ‘/etc/nginx/client_body_temp’: 权限不够
  14. find: ‘/etc/nginx/proxy_temp’: 权限不够
  15. find: ‘/etc/nginx/fastcgi_temp’: 权限不够
  16. find: ‘/etc/nginx/uwsgi_temp’: 权限不够
  17. find: ‘/etc/nginx/scgi_temp’: 权限不够
  18. /etc/libreport/events.d/vimrc_event.conf

若不想将错误输出到屏幕中,可将错误重定向到空设备中

  1. [kedacom@kedacom ~]$ find /etc/ -name "*.conf" 2> /dev/null| grep rc
  2. /etc/libreport/events.d/vimrc_event.conf

3. 有些命令是不支持管道技术的

  1. [kedacom@kedacom ~]$ which cat
  2. /usr/bin/cat
  3. [kedacom@kedacom ~]$ ll /usr/bin/cat
  4. -rwxr-xr-x. 1 root root 54160 2 25 2019 /usr/bin/cat
  5. #将which cat输出作为ls -l的输入
  6. #实际ls -l输出的是当前目录的文件,并未实现管道技术
  7. [kedacom@kedacom ~]$ which cat | ls -l
  8. 总用量 650348
  9. -rw-r--r-- 1 kedacom root 6053 1 31 21:58 all
  10. -rw-r--r-- 1 root root 19555 12 31 13:32 choujian1.log
  11. -rw-r--r-- 1 root root 1204176 12 31 11:13 choujian_per.log
  12. -rw-r--r-- 1 kedacom root 745 1 31 21:54 error
  13. -rw-r--r-- 1 root root 43254688 10 18 17:31 iau
  14. -rw-r--r-- 1 kedacom root 5308 1 31 21:54 out
  15. -rw-r--r-- 1 root root 131447710 12 23 12:21 slave_exe_install.tar
  16. -rw-r--r-- 1 root root 431057610 12 23 12:21 spot_check_system.tar
  17. -rw-r--r-- 1 tcpdump tcpdump 58942461 4 16 2021 tsu.pcap

ls命令不支持管道技术,若需要让不支持管道技术的命令实现管道技术,可以使用xargs

  1. [kedacom@kedacom ~]$ which cat | xargs ls -l
  2. -rwxr-xr-x. 1 root root 54160 2 25 2019 /usr/bin/cat

xargs说明
用途:将参数列表转换成小块分段传递给其他命令
读入stdin的数据转换为参数添加到命令行中
让一些不支持管道的命令可以使用管道