管道
Shell可以将两个或多个程序连接到一起,以使一个程序的输出变成另一个程序的输入,这种方式连接的两个或者多个程序就形成了管道。管道通常用于执行一些复杂的数据处理操作。这些命令之间使用控制操作符(管道符)"|"连接。
管道的语法格式:
command1 | command2 command1 | command2 [ commandN... ]
操作符"|"与">"的区别
">"是将第一个命令的输出写入到后面的文件或者特定文件描述符指定的文件中。如:
[root@rs1 ~]# ls > less [root@rs1 ~]# ls anaconda-ks.cfg httpd-2.4.6-45.el7.x86_64.rpm less [root@rs1 ~]# cat less anaconda-ks.cfg httpd-2.4.6-45.el7.x86_64.rpm less
ls命令将当前目录所有的文件/目录名都输出,由重定向操作符">"写入到less文件中。
"|"是将第一个命令的输出作为输入,用第二个命令去处理。如:
[root@rs1 ~]# ls | cat anaconda-ks.cfg httpd-2.4.6-45.el7.x86_64.rpm less [root@rs1 ~]# ls anaconda-ks.cfg httpd-2.4.6-45.el7.x86_64.rpm less
ls命令将当前目录所有的文件/目录名都输出,cat命令将ls的输出结果作为输入,去执行,打印结果到终端。
为什么要使用管道
管道是进程间通信的方式之一,Shell使用管道的原因:
命令的与发紧凑并且简单
使用管道,将多个命令串连到一起,有时候可以完成命令单独执行不方便或者不能完成的复杂任务
从管道输出的标准错误会混合到一起
使用管道连接程序
实例1:使用管道可以查看指定进程的运行状态,如果加上输出重定向,还可以将指定结果输出到某个文件中。如:
[root@rs1 ~]# ps -ax | grep httpd > httpd.state [root@rs1 ~]# cat httpd.state 1930 ? Ss 0:00 /usr/sbin/httpd -DFOREGROUND 1931 ? S 0:00 /usr/sbin/httpd -DFOREGROUND 1932 ? S 0:00 /usr/sbin/httpd -DFOREGROUND 1933 ? S 0:00 /usr/sbin/httpd -DFOREGROUND 1934 ? S 0:00 /usr/sbin/httpd -DFOREGROUND 1935 ? S 0:00 /usr/sbin/httpd -DFOREGROUND 1941 pts/2 R+ 0:00 grep --color=auto httpd
实例2:显示按用户名排序后的当前登陆系统的用户信息
[root@rs1 ~]# w | sort 00:59:50 up 9 min, 4 users, load average: 0.00, 0.01, 0.03 root pts/0 00:51 8:26 0.00s 0.00s -bash root pts/1 00:51 8:06 0.00s 0.00s -bash root pts/2 00:51 6.00s 0.01s 0.00s w root pts/3 00:51 8:11 0.00s 0.00s -bash USER TTY LOGIN@ IDLE JCPU PCPU WHAT
w命令的输出作为sort命令的输入,从而将用户按顺序排列。
实例3:统计当前系统中登陆用户数
[root@rs1 ~]# who | wc -l 4
实例4:查看系统中安装的glibc包的版本
[root@rs1 ~]# rpm -qa |grep glibc glibc-2.17-55.el7.x86_64 glibc-common-2.17-55.el7.x86_64
实例5:以比较容易读取格式,显示系统中挂载的伪文件系统信息
[root@rs1 ~]# mount | grep "proc" | column -t proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=32,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)
实例6:将一个列文件中的内容转换为一行
[root@rs1 ~]# cat less anaconda-ks.cfg httpd-2.4.6-45.el7.x86_64.rpm less [root@rs1 ~]# cat less | tr '\n' ' ' | xargs anaconda-ks.cfg httpd-2.4.6-45.el7.x86_64.rpm less
实例7:生成一个7位的随机密码
[root@rs1 ~]# tr -dc A-Za-z0-9_ < /dev/urandom | head -c7 | xargs P2v1y_x
管道中的输入重定向
输入重定向操作符"<"可以在管道中使用,用来从文件中获取输入。其语法:
command1 < input.txt | command2
如:使用tr命令从less文件中获取输入,然后通过管道将输出发送给sort命令:
[root@rs1 ~]# cat less anaconda-ks.cfg httpd-2.4.6-45.el7.x86_64.rpm less less [root@rs1 ~]# tr a-z A-Z < less | sort ANACONDA-KS.CFG HTTPD-2.4.6-45.EL7.X86_64.RPM LESS LESS [root@rs1 ~]# tr a-z A-Z < less | sort | uniq ANACONDA-KS.CFG HTTPD-2.4.6-45.EL7.X86_64.RPM LESS
使用管道中的输出重定向
可以使用重定向操作符">"或">>"将管道中最后一个命令的标准输出进行重定向。语法:
command1 | command2 | ... | commandN > output_file command1 < input_file | command2 | ... | commandN > output_file
如:使用who命令显示当前登陆的用户,并使用sort命令排序,最后保存到指定文件中。
[root@rs1 ~]# who | sort > who.txt [root@rs1 ~]# cat who.txt root pts/0 2018-07-15 00:51 (fsx) root pts/1 2018-07-15 00:51 (fsx) root pts/2 2018-07-15 00:51 (fsx) root pts/3 2018-07-15 00:51 (fsx)
过滤器
将几个命令通过管道符组合在一起就形成了管道。通常,通过这种方式使用的命令就被称为过滤器。过滤器会获取输入,通过某种方式修改其内容,然后将其输出。
简单的说,过滤器有如下特点:
如果一个LInux命令是从标准输入接收它的输入数据,并在标准输出上产生他的输出,这个命令就被称为过滤器
过滤器通常和Linux管道一起使用
常用的被作为过滤器的命令如下:
命令 | 作用 |
---|---|
awk | 用于文本处理的解释性程序设计语言,通常作为数据提取和报告的工具 |
cut | 用于将每个输入文件的每行指定部分输出到标准输出 |
grep | 用于搜索一个或多个文件中匹配指定模式的行 |
tar | 用于归档文件的应用程序 |
head | 用于读取文件的开头部分。如果没有指定文件,则从标准输入读取 |
paste | 用于合并文件的行 |
sed | 用于过滤和转换文本的流编辑器 |
sort | 用于对文本文件的行进行排序 |
split | 用于将文件分割分块 |
strings | 用于打印文件中可打印的字符串 |
tac | 与cat命令功能相反,用于倒序显示文件或连接文件 |
tail | 用于显示文件的结尾部分 |
tee | 用于从标准输入读取内容并写入到标准输出和文件 |
tr | 用于转换或删除字符 |
uniq | 用于报告或忽略重复行 |
wc | 用于打印文件中的总行数、单词数或字节数 |
在管道中使用awk命令
实例1:查看系统中所有帐号的名称,并按名称的字母数须排序。
[root@rs1 ~]# awk -F: '{print $1}' /etc/passwd | sort adm apache avahi avahi-autoipd bin daemon dbus ftp games halt kiosk lp mail nobody operator polkitd postfix root shutdown sshd sync
":"为列分割符,将文件/etc/passwd内容分为多列,并打印到第一列的信息,通过管道发送给sort命令
实例2:查看当前帐号最常用的10个命令
[root@rs1 ~]# history | awk '{print $2}' | sort | uniq -c | sort -rn | head 255 vim 222 bash 204 ls 58 cd 54 cat 19 crontab 17 rm 14 tr 12 sed 11 echo
histroty命令将输出通过管道发送给awk,awk命令默认使用空格作为列分割符,将history的输出分为两列,将第二列的内容作为输出通过管道符发送给sort命令,sort排序后,将输出通过管道符号发送给uniq命令,uniq命令统计历史命令的出现次数,再用sort将uniq命令处理的输出按照重复次数从高到底排序,最后传递给head命令,head列出前10个(默认是10个)。
实例3:西那是当前系统的内存大小,单位为KB
[root@rs1 ~]# free | grep Mem | awk '{print $2}' 501884
在管道中使用cut命令
cut命令被用于文本处理,可以使用cut来提取文件中指定的列内容。
实例1:查看系统中登陆Shell是"/bin/bash"的用户名和对应的用户主目录信息
[root@rs1 ~]# grep "/bin/bash" /etc/passwd | cut -d: -f1,6 root:/root kiosk:/home/kiosk
/etc/passwd中以":"分割,第一个字段是帐号的账户名,第六个字段是主目录的路径
实例2:查看当前即其的CPU类型
[root@rs1 ~]# cat /proc/cpuinfo | grep name | cut -d: -f2 | uniq Intel Xeon E312xx (Sandy Bridge) 或者: [root@rs1 ~]# lscpu | grep "Model name" | cut -d: -f2 Intel Xeon E312xx (Sandy Bridge)
实例3:查看当前目录下子目录的个数
[root@rs1 mnt]# ls -l | cut -c 1 | grep d |wc -l 10
这里解释:
ls -l输出的内容,每行的第一个字符表示文件类型,如果是d,则表示是目录
cut -c 1是截取每行的第一个字符
grep d是获取文件类型为目录的行
wc -l是统计grep输出的行数,即目录个数
在管道中使用grep命令
grep是管道中十分常用的一个命令。
实例1:查看系统中HTTP服务的进程信息
[root@rs1 mnt]# ps -ax | grep httpd 1930 ? Ss 0:00 /usr/sbin/httpd -DFOREGROUND 1931 ? S 0:00 /usr/sbin/httpd -DFOREGROUND 1932 ? S 0:00 /usr/sbin/httpd -DFOREGROUND 1933 ? S 0:00 /usr/sbin/httpd -DFOREGROUND 1934 ? S 0:00 /usr/sbin/httpd -DFOREGROUND 1935 ? S 0:00 /usr/sbin/httpd -DFOREGROUND 2200 pts/3 R+ 0:00 grep --color=auto httpd
实例2:差早承袭列表中所有包含zip关键字的命令
[root@rs1 mnt]# ls /usr/bin/ /bin/ | sort | uniq | grep zip gpg-zip gunzip gzip
实例3:查看系统安装的kernal版本和相关的kernel软件包
[root@rs1 mnt]# rpm -qa | grep kernel kernel-3.10.0-123.el7.x86_64 kernel-tools-3.10.0-123.el7.x86_64 kernel-tools-libs-3.10.0-123.el7.x86_64
实例4:查到/etc目录下所有包含IP地址的文件
[root@rs1 mnt]# find /etc -type f -exec grep '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]' {} \;
在管道中使用tar命令
tar命令是Linux系统中最常见的打包文件的命令。
实例1:使用tar命令复制一个目录的整体结构
[root@rs1 mnt]# tar cf - /mnt/ | (cd /backup; tar xf -)
实例2:检查tar归档文件的大小
[root@rs1 mnt]# cd /;tar cf - etc | wc -c 18554880
实例3:检查tar归档文件压缩为tar.gz归档文件后大小
[root@rs1 ~]# tar czf - fsx.tar | wc -c
2367404
[root@rs1 ~]# tar czf - fsx.tar | du -sh
4.8M .
实例4:检查tar归档文件压缩为tar.bz2归档后文件所占大小
[root@rs1 ~]# tar cjf - fsx.tar | wc -c
2386060
[root@rs1 ~]# tar cjf - fsx.tar | du -sh
4.8M .
在管道中使用head命令
head命令可以指定只打印出前几行输出,默认为10行
实例1:显示ls命令前3行输出
[root@rs1 ~]# ls anaconda-ks.cfg fsx fsx.tar httpd-2.4.6-45.el7.x86_64.rpm httpd.state less sort.txt who.txt [root@rs1 ~]# ls | head -n 3 anaconda-ks.cfg fsx fsx.tar
在管道中使用paste命令
paste命令用于合并文件的行,也可以通过管道接受其他命令的输出,并对其内容进行相应的合并处理
实例1:通古管道将file1文件和cat命令的输出合并
[root@rs1 ~]# cat file1 | paste -d, - file2 fsx,狗肉 coco,狗肉汤 ,coco ,zzz [root@rs1 ~]# cat file1 fsx coco [root@rs1 ~]# cat file2 狗肉 狗肉汤 coco zzz
实例2:通过管道使用paste命令将ls命令分成4列显示
[root@rs1 ~]# ls | paste -d\\t - - - - anaconda-ks.cfg file1 file2 fsx fsx.tar httpd-2.4.6-45.el7.x86_64.rpm httpd.state less sort.txt who.txt
在管道中使用sed命令
sed命令是流编辑器的简称
实例1:替换打印的输出文本中的内容(将所有"f"字符替换成汉字"范")
[root@rs1 ~]# ls anaconda-ks.cfg file1 file2 fsx fsx.tar httpd-2.4.6-45.el7.x86_64.rpm httpd.state less sort.txt who.txt [root@rs1 ~]# ls | sed 's/f/范/' anaconda-ks.c范g 范ile1 范ile2 范sx 范sx.tar httpd-2.4.6-45.el7.x86_64.rpm httpd.state less sort.txt who.txt
实例2:显示/etc/paaaswd文件中除第3~10行意外的内容
[root@rs1 ~]# cat -n /etc/passwd | sed '3,10d' 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 11 games:x:12:100:games:/usr/games:/sbin/nologin 12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 13 nobody:x:99:99:Nobody:/:/sbin/nologin 14 dbus:x:81:81:System message bus:/:/sbin/nologin 15 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 16 avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin 17 avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin 18 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 19 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 20 kiosk:x:1000:1000:kiosk:/home/kiosk:/bin/bash 21 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
实例3:只显示/etc/passwd文件3~10行内容
[root@rs1 ~]# cat -n /etc/passwd | sed -n '3,10p' 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin
在管道中使用sort命令
sort命令用于对文本内容按行进行排序,也可以通过管道对一个命令的输出进行排序
实例1:将ls命令列出的文件按大小排序
[root@rs1 ~]# ls -l | sort -r -n -k5 -rw-r--r-- 1 root root 2478080 Jul 15 14:21 fsx.tar -rw-------. 1 root root 1239040 Jul 15 14:16 anaconda-ks.cfg -r--r--r-- 1 root root 1226816 Jul 10 23:05 httpd-2.4.6-45.el7.x86_64.rpm -rw-r--r-- 1 root root 387 Jul 15 00:59 httpd.state -rw-r--r-- 1 root root 180 Jul 15 01:24 who.txt -rw-r--r-- 1 root root 51 Jul 15 01:20 sort.txt -rw-r--r-- 1 root root 26 Jul 15 14:28 file2 -rw-r--r-- 1 root root 9 Jul 15 14:27 file1 -rw-r--r-- 1 root root 8 Jul 15 02:35 less -rw-r--r-- 1 root root 8 Jul 15 02:35 fsx total 4860
实例2:将ps命令输出按pid大小,罗列前10个
[root@rs1 ~]# ps -ax | sort -n | head PID TTY STAT TIME COMMAND 1 ? Ss 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 23 2 ? S 0:00 [kthreadd] 3 ? S 0:00 [ksoftirqd/0] 5 ? S< 0:00 [kworker/0:0H] 7 ? S 0:00 [migration/0] 8 ? S 0:00 [rcu_bh] 9 ? S 0:00 [rcuob/0] 10 ? R 0:00 [rcu_sched] 11 ? S 0:00 [rcuos/0]
在管道中使用split命令
split命令将文件分割成块,也可以通过管道将其他命令输出的内容分割成指定大小的块,并存入指定前缀的文件中
实例1:将ls命令的输出按每5行为一块,存入文件名前缀为lsroot的文件中
[root@rs1 ~]# ls | split -l 5 - lsroot [root@rs1 ~]# ls lsroota* lsrootaa lsrootab lsrootac [root@rs1 ~]# cat lsroota lsrootaa lsrootab lsrootac [root@rs1 ~]# cat lsrootaa | wc -l 5 [root@rs1 ~]# cat lsrootab | wc -l 5 [root@rs1 ~]# cat lsrootab httpd-2.4.6-45.el7.x86_64.rpm httpd.state less lsrootaa lsrootab
实例2:将backup目录按每5兆大小进行打包压缩,生成的压缩包文件名前缀为backup.tar.gz
[root@rs1 ~]# tar czf - etc | split -b 2m - backup.tar.gz. [root@rs1 ~]# ls anaconda-ks.cfg backup.tar.gz.ac file1 fsx.tar less lsrootac backup.tar.gz.aa backup.tar.gz.ad file2 httpd-2.4.6-45.el7.x86_64.rpm lsrootaa sort.txt backup.tar.gz.ab etc fsx httpd.state lsrootab who.txt [root@rs1 ~]# du -sh backup.tar.gz.a* 2.0M backup.tar.gz.aa 2.0M backup.tar.gz.ab 2.0M backup.tar.gz.ac 320K backup.tar.gz.ad
在管道中使用strings命令
strings命令用于打印文件中的可打印字符串,常用来与grep命令配合使用,在二进制文件中查找字符串
实例1:查找uptime命令中GLIBC字符串
[root@rs1 ~]# strings /usr/bin/uptime | grep GLIBC GLIBC_2.3.4 GLIBC_2.4 GLIBC_2.2.5
实例2:打印系统的BIOS信息
[root@localhost mnt]# dd if=/dev/mem bs=1k skip=768 count=256 | strings -n 32 2089Intel(R)Sandybridge Mobile PCI Accelerated SVGA BIOS Build Number: 2089(768_960) PC 14.34 10/30/2010 03:43:33 DECOMPILATION OR DISASSEMBLY PROHIBITED Copyright (C) 2000-2003 Intel Corp. All Rights Reserved. LFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelName LFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelName+a Intel(R)Sandybridge Mobile Graphics Chipset Accelerated VGA BIOS Intel(R)Sandybridge Mobile Graphics Controller XXZZZ\\\```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqq}}}~~~ 256+0 records in 256+0 records out 262144 bytes (262 kB) copied, 0.00221095 s, 119 MB/s Phoenix Technology Ltd. Generic MP driver. Rev. 02, 12/06/2006 Boot From Floppy...$Boot From Hard Disk...$Boot From CD/DVD ROM...$Boot From PCMCIA...$Boot From USB...$Boot From Embedded Network...$Boot From BEV Device...$!!! UNSUPPORTED !!!$Booting BCV Device ## - Floppy$Booting BCV Device ## - Hard Disk$Booting BCV Device ## - CD/DVD$Booting BCV Device ## - PCMCIA/ExpressCard$Booting BCV Device ## - USB$Booting BEV Device ## - Network$Booting BEV Device ##$Calling INT 19h$Returned INT 19h$Copyright (c) 2007-2010 Phoenix Technologies Ltd. This program contains proprietary and confidential information. All rights reserved except as may be permitted by prior written $DISK BOOT FAILURE, INSERT SYSTEM DISK AND PRESS ENTER$` IDE HBA ver1.00 PHOENIX Tech Ltd (C) COPYRIGHT LENOVO 2005, 2010 ALL RIGHTS RESERVED IBM COMPATIBLE 486 BIOS COPYRIGHT Phoenix Technologies, Ltd
在管道中使用tail命令
tail命令用于打印文件的最后几行,和head相反。也可以用管道显示其他命令输出的最后即行内容。
实例1:显示ls命令输出的最后3行
[root@rs1 ~]# ls | tail -n 3 lsrootac sort.txt who.txt
实例2:显示/etc/passwd文件中UID最高的用户信息
[root@rs1 ~]# sort /etc/passwd -t: -k3 -n | tail -n1 kiosk:x:1000:1000:kiosk:/home/kiosk:/bin/bash
在管道中使用tee命令
tee命令用于存储和查看任意其他命令的输出。使用tee命令,你可以从一个输入流读取输入,并分割输出流到两个重定向,所以输出既显示在屏幕,又重定向到文件中。
实例1:使用ls命令显示目录以file开头的文件列表,并重定向到/tmo/ls.output文件中
[root@rs1 ~]# ls file* | tee /tmp/ls.out file1 file2 [root@rs1 ~]# cat /tmp/ls.out file1 file2
实例2:在管道中的不同阶段存储命令中间结果
[root@rs1 ~]# ls | tee /tmp/ls.out | grep ^b | tee /tmp/stage2.txt | sort -r backup.tar.gz.ad backup.tar.gz.ac backup.tar.gz.ab backup.tar.gz.aa [root@rs1 ~]# cat /tmp/ls.out anaconda-ks.cfg backup.tar.gz.aa backup.tar.gz.ab backup.tar.gz.ac backup.tar.gz.ad etc file1 file2 fsx fsx.tar httpd-2.4.6-45.el7.x86_64.rpm httpd.state less lsrootaa lsrootab lsrootac sort.txt who.txt [root@rs1 ~]# cat /tmp/stage2.txt backup.tar.gz.aa backup.tar.gz.ab backup.tar.gz.ac backup.tar.gz.ad
首先ls命令罗列除当前目录所有内容,然后将输出存储到/tmp/ls_outfile中。再通过grep命令过滤出b开头的文件,将输出传递给第二个tee命令,输出到终端,并保存只/tmp/stage2.txt文件中,并将输出(这里输出的只是终端显示的部分,保存至stage2.txt文件中的内容不再作为输出通过管道)使用sort反响排序。
在管道中使用tr命令
tr命令用于转换和删除字符
实例1:将所有的空白字符转换为制表符
[root@rs1 ~]# echo "This is for testing" | tr [:space:] '\t' This is for testing
实例2:删除前一个命令输出中的所有数字
[root@rs1 ~]# echo "This is for testing 1235" | tr -d [:digit:] This is for testing
实例3:将前一个命令输出中的所有字符转换为大写,并排序,使用tee显示终端并保存至file1.txt文件中
[root@rs1 ~]# cat file1 | tr a-z A-Z | sort | tee file1.txt COCO FSX [root@rs1 ~]# cat file1.txt COCO FSX
在管道中使用wc命令
wc命令用于统计在文本流中的字符数、单字数或字节数等
实例1:统计当前登陆到系统的用户数
[root@rs1 ~]# who | wc -l 4 [root@rs1 ~]# who root pts/0 2018-07-15 00:51 (fsx) root pts/1 2018-07-15 00:51 (fsx) root pts/2 2018-07-15 00:51 (fsx) root pts/3 2018-07-15 00:51 (fsx)
实例2:统计当前的Linux系统中的进程数
[root@rs1 ~]# ps -ef | wc -l 98 [root@rs1 ~]# ps -ax | wc -l 98
小结
管道:将两个或多个程序连接到一起,使得一个程序的输出作为下一个程序的输入,这样连接的两个或多个程序形成了管道
重定向符是将命令和文件连接,管道是将多个命令连接到一起
管道有一些特点:
命令的语法紧凑并使用简单
多个命令串连,完成复杂任务
管道输出的标准错误会混合到一起
几个命令组合在一起,形成一个管道,这种方式使用的命令通常称之为过滤器
如果Linux命令是从标准输入接收数据,并在标准输出上显示数据,这个命令就被称之为过滤器
过滤器通常和Linux管道一起使用