Linux管道(Pipes)和过滤器Filters

在本章中,我们将详细讨论Linux中的管道和过滤器。 您可以将两个命令连接在一起,以便一个程序的输出成为下一个程序的输入。 以这种方式连接的两个或多个命令形成一个管道。

要制作管道,请在命令行上的两个命令之间放置一个竖线 (|)。

当一个程序从另一个程序获取输入时,它对该输入执行一些操作,并将结果写入标准输出。 它被称为过滤器。

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命令的选项:

NO 选项和说明
1 -v 打印所有与模式不匹配的行。
2 -n 打印匹配的行及其行号。
3 -l 仅打印具有匹配行的文件名(字母“l”)
4 -c 仅打印匹配行的计数。
5 -i 匹配大写或小写。

现在让我们演示一下如何使用正则表达式完成某些工作,下面的命令告诉grep查找带有carol的行,.*表示后面可以什么都没有或其它任何字符),然后包含Aug的行。

$ls -l | grep -i "carol.*aug"
-rw-rw-r--   1 carol doc      1605 Aug 23 07:35 macros

排序命令

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命令默认按字母顺序排列文本行。 有很多选项可以控制排序

| NO | 描述 | | 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跳过四个字段(字段由空格分隔)然后按数字顺序对行进行排序。

pgmore命令

有的时候显示在屏幕上的输出会很长,您可以使用more作为过滤器; 一旦屏幕显示不无所有文本,显示就会停止。

假设您有一个很长的目录列表。 为了更容易阅读排序后的列表,请按如下方式通过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提示,您可以在其中键入命令以在已排序的文本中移动。

More的常用操作命令

  • Enter 向下n行,需要定义。默认为1行
  • Ctrl+F 向下滚动一屏
  • 空格键 向下滚动一屏
  • Ctrl+B 返回上一屏
  • = 输出当前行的行号
  • :f 输出文件名和当前行的行号
  • V 调用vi编辑器
  • !命令 调用Shell,并执行命令
  • q 退出more