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
按文件大小进行排序。
下面的管道由命令ls
、grep
和sort
组成,
例如,
$ 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
命令从前向后读取文件。