📜  Unix / Linux-管道和过滤器

📅  最后修改于: 2020-10-31 14:47:05             🧑  作者: Mango


在本章中,我们将详细讨论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命令一起使用-

Sr.No. Option & Description
1

-v

Prints all lines that do not match pattern.

2

-n

Prints the matched line and its line number.

3

-l

Prints only the names of files with matching lines (letter “l”)

4

-c

Prints only the count of matching lines.

5

-i

Matches either upper or lowercase.

现在让我们使用一个正则表达式,告诉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命令按字母顺序排列文本行。有很多选项可以控制排序-

Sr.No. Description
1

-n

Sorts numerically (example: 10 will sort after 2), ignores blanks and tabs.

2

-r

Reverses the order of sort.

3

-f

Sorts upper and lowercase together.

4

+x

Ignores first x fields when sorting.

一个管道中可以链接两个以上的命令。以使用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和更多命令

通常,您可以在屏幕上压缩较长的输出,但是如果您通过更多内容运行文本或使用pg命令作为过滤器,则可以;屏幕上充满文字后,显示即停止。

假设您的目录清单很长。为了更容易阅读排序列表,请通过以下方式通过更多管道输出-

$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程序的讨论中列出的任何命令。