Unix / Linux - 管道和过滤器
在本章中,我们将详细讨论 Unix 中的管道和过滤器。 您可以将两个命令连接在一起,以便一个程序的输出成为下一个程序的输入。 以这种方式连接的两个或多个命令形成一个管道。
要制作管道,请在命令行中的两个命令之间放置一个竖线 (|)。
当一个程序从另一个程序获取输入时,它对该输入执行一些操作,并将结果写入标准输出。 它被称为过滤器。
grep 命令
grep 命令在一个或多个文件中搜索具有特定模式的行。 语法是 −
$grep pattern file(s)
"grep" 这个名字来自 ed(一个 Unix 行编辑器)命令 g/re/p,意思是"全局搜索正则表达式并打印所有 包含它的行"。
正则表达式是一些纯文本(例如一个词)和/或用于模式匹配的特殊字符。
grep 最简单的用法是查找由单个单词组成的模式。 它可以在管道中使用,以便只有那些包含给定字符串的输入文件行被发送到标准输出。 如果你不给 grep 一个文件名来读取,它会读取它的标准输入; 这就是所有过滤程序的工作方式 −
$ls -l | grep "Aug" -rw-rw-rw- 1 john doc 11008 Aug 6 14:10 ch02 -rw-rw-rw- 1 john doc 8515 Aug 6 15:30 ch07 -rw-rw-r-- 1 john doc 2488 Aug 15 10:51 intro -rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros $
有多种选项可以与 grep 命令一起使用 −
序号 | 选项 & 描述 |
---|---|
1 |
-v 打印所有不匹配模式的行。 |
2 |
-n 打印匹配的行及其行号。 |
3 |
-l 仅打印具有匹配行(字母"l")的文件名 |
4 |
-c 仅打印匹配行数。 |
5 |
-i 匹配大写或小写。 |
现在让我们使用一个正则表达式来告诉 grep 查找带有 "carol" 的行,后跟零或其他在正则表达式中缩写为 ".*") 的字符,然后是 "Aug"。−
在这里,我们使用 -i 选项进行不区分大小写的搜索 −
$ls -l | grep -i "carol.*aug" -rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros $
sort 命令
sort 命令按字母或数字排列文本行。 以下示例对 food 文件中的行进行排序 −
$sort food Afghani Cuisine Bangkok Wok Big Apple Deli Isle of Java Mandalay Sushi and Sashimi Sweet Tooth Tio Pepe's Peppers $
sort 命令默认按字母顺序排列文本行。 有很多选项可以控制排序 −
序号 | 说明 |
---|---|
1 |
-n 按数字排序(例如:10 将排在 2 之后),忽略空格和制表符。 |
2 |
-r 颠倒排序顺序。 |
3 |
-f 将大写字母和小写字母一起排序。 |
4 |
+x 排序时忽略前 x 个字段。 |
可以将两个以上的命令链接到一个管道中。 以之前使用 grep 的管道为例,我们可以进一步按照大小顺序对 8 月修改的文件进行排序。
以下管道由命令 ls、grep 和 sort 组成 −
$ls -l | grep "Aug" | sort +4n -rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros -rw-rw-r-- 1 john doc 2488 Aug 15 10:51 intro -rw-rw-rw- 1 john doc 8515 Aug 6 15:30 ch07 -rw-rw-rw- 1 john doc 11008 Aug 6 14:10 ch02 $
此管道按大小顺序对 8 月修改的目录中的所有文件进行排序,并将它们打印在终端屏幕上。 排序选项 +4n 跳过四个字段(字段由空格分隔),然后按数字顺序对行进行排序。
pg 和更多命令
一个长输出通常可以被你压缩到屏幕上,但是如果你通过 more 运行文本或者使用 pg 命令作为过滤器; 一旦屏幕充满文本,显示就会停止。
假设您有一个很长的目录列表。 为了更容易阅读排序后的列表,将输出通过 more 进行管道传输,如下所示 −
$ls -l | grep "Aug" | sort +4n | more -rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros -rw-rw-r-- 1 john doc 2488 Aug 15 10:51 intro -rw-rw-rw- 1 john doc 8515 Aug 6 15:30 ch07 -rw-rw-r-- 1 john doc 14827 Aug 9 12:40 ch03 . . . -rw-rw-rw- 1 john doc 16867 Aug 6 15:56 ch05 --More--(74%)
一旦屏幕充满由按文件大小顺序排序的行组成的文本,屏幕就会填满。 屏幕底部是 more 提示,您可以在其中键入命令以浏览已排序的文本。
完成此屏幕后,您可以使用更多程序的讨论中列出的任何命令。