Linux中可以将两个命令连接在一起,以便一个程序的输出成为下一个程序的输入。以这种方式连接的两个或多个命令形成一个管道。要创建管道,在命令行上两个命令之间放置一个竖线(|)。当一个程序从另一个程序获取输入时,它对该输入执行一些操作,并将结果写入标准输出。它被称为过滤器。本文主要介绍Linux 中管道和过滤器。

1、管道

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

其语法格式如下,

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

例如,

ls | head
ls | cat

2、过滤器

将几个命令通过管道符组合在一起就形成了管道。通常,通过这种方式使用的命令就被称为过滤器。过滤器会获取输入,通过某种方式修改其内容,然后将其输出。

常用的被作为过滤器的命令如下:

命令

作用

awk

用于文本处理的解释性程序设计语言,通常作为数据提取和报告的工具

cut

用于将每个输入文件的每行指定部分输出到标准输出

grep

用于搜索一个或多个文件中匹配指定模式的行

tar

用于归档文件的应用程序

head

用于读取文件的开头部分。如果没有指定文件,则从标准输入读取

paste

用于合并文件的行

sed

用于过滤和转换文本的流编辑器

sort

用于对文本文件的行进行排序

split

用于将文件分割分块

strings

用于打印文件中可打印的字符串

tac

与cat命令功能相反,用于倒序显示文件或连接文件

tail

用于显示文件的结尾部分

tee

用于从标准输入读取内容并写入到标准输出和文件

tr

用于转换或删除字符

uniq

用于报告或忽略重复行

wc

用于打印文件中的总行数、单词数或字节数

1)grep 命令

grep命令在一个或多个文件中搜索具有特定模式的行。语法如下:

grep pattern file(s)

grep来自ed (Unix行编辑器)命令g/re/p,表示的是全局搜索正则表达式并打印包含它的所有行。

正则表达式是一些纯文本(例如一个单词)and/or 用于模式匹配的特殊字符。

grep最简单的用法是查找由单个单词组成的模式。它可以在管道中使用,以便只有那些包含给定字符串的输入文件行才被发送到标准输出。如果没有给grep一个要读取的文件名,它会读取它的标准输入;这就是所有过滤程序的工作方式。

例如,

$ ls -l | grep "2018"
drwxr-xr-x   6 levizhong  staff      192  9 23  2018 cjavapy
drwxr-xr-x  10 levizhong  staff      320  9 23  2018 apache-tomcat-7.0.52
-rw-r--r--   1 levizhong  staff       43 11  1  2018 cjavapy.code
-rw-r--r--   1 levizhong  staff    25389 11  1  2018 mip_logo (1).psd
drwxr-xr-x   3 levizhong  staff       96  9 23  2018 mongodb_bak_2018_06_18

有各种各样的选项可以与grep命令一起使用,如下:

grep命令选项:

-v:过滤非匹配的字符集

-E:支持扩展的re

-i:忽视大小写

-l:查询多文件时只输出包含匹配字符的文件名。

-o:仅输出匹配的内容

-n:显示行号

-q:不输出任何信息

-A num:显示匹配行的后面的行数

-B num:显示匹配行的前面的行数

-C num:显示匹配行的前后的行数

注意:

egrep:支持扩展的re

fgrep:不支持re

下面使用一个正则表达式来告诉grep查找带有"2019"的行,后跟0或多个字符,其正则表达式中缩写为“.*”的字符),然后再后跟"urls"

使用-i选项进行不区分大小写的搜索,

例如,

$ ls -l | grep -i "2019.*urls"
-rw-r--r-- 1 levizhong staff 301 5 5 2019 urls.txt_mip

2)sort 命令

sort命令按字母或数字顺序排列文本行。下面的示例对cjavapy文件中的行进行排序:

$ sort artcle 
C C++ CSharp
cjavapy Python
Code of Java
Java JavaScript
Levi Zhong
Levi Zhong's PC
Linux
Linux VPS Docker

sort命令默认按字母顺序排列文本行。有许多选项可以控制排序,如下表,

命令

说明

-n

按数字排序(例如,10将在2之后排序),忽略空格和制表符。

-r

reverse 反向排序

-f

将大写字母和小写字母排列在一起。

+x

在排序时先忽略x个字段。

可以将两个以上的命令连接到一个管道中。以前面使用grep的管道示例为例,使用sort按文件大小进行排序。

下面的管道由命令lsgrepsort组成,

例如,

$ ls -l | grep "2018" | sort +4n
-rw-r--r-- 1 levizhong staff 43 11 1 2018 cjavapy.code-workspace
drwxr-xr-x 3 levizhong staff 96 9 23 2018 mongodb_bak_2018_06_18
drwxr-xr-x 6 levizhong staff 192 9 23 2018 StorageWebcjavapy
drwxr-xr-x 10 levizhong staff 320 9 23 2018 apache-tomcat-7.0.52
-rw-r--r-- 1 levizhong staff 25389 11 1 2018 mip_logo (1).psd

注意:目录中2018年的所有文件按照大小顺序进行排序,并在终端屏幕上打印它们。排序选项+4n是跳过四个字段(字段由空格分隔),并且按数字顺序对行进行排序。

3)more 命令

一个长输出通常可以在屏幕上被压缩,但如果运行文本通过more作为过滤器;一旦屏幕上充满了文本,显示就会停止。

假设有一个很长的目录列表。为了更容易阅读排序后的清单,可以通过下面的管道输出,

例如,

$ ls -l | grep "2018" | sort +4n | more
-rw-r--r-- 1 levizhong staff 43 11 1 2018 cjavapy.code-workspace
drwxr-xr-x 3 levizhong staff 96 9 23 2018 mongodb_bak_2018_06_18
drwxr-xr-x 6 levizhong staff 192 9 23 2018 StorageWebcjavapy
drwxr-xr-x 10 levizhong staff 320 9 23 2018 apache-tomcat-7.0.52
-rw-r--r-- 1 levizhong staff 25389 11 1 2018 mip_logo (1).psd
(END)

一旦屏幕上充满了按文件大小排序的行组成的文本,屏幕就会被填满。在屏幕的底部是more命令的提示符,可以在这里输入一个命令来移动已排序的文本。基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 。more命令从前向后读取文件。