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

-我

匹配大写或小写。

现在让我们使用一个正则表达式,告诉 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
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 月份修改的文件进行排序。

以下管道由命令lsgrepsort组成-

$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 命令

通常,您可以在屏幕上压缩长输出,但是如果您通过 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 程序讨论中列出的任何命令。