位置:首页 > 其他技术 > Unix > UNIX 管道和过滤器

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

Option 描述
-v Print all lines that do not match pattern.
-n Print the matched line and its line number.
-l Print only the names of files with matching lines (letter "l")
-c Print only the count of matching lines.
-i Match 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文件:

$sort food
Afghani Cuisine
Bangkok Wok
Big Apple Deli
Isle of Java
Mandalay
Sushi and Sashimi
Sweet Tooth
Tio Pepe's Peppers
$

sort命令默认情况下,按字母顺序排列的文本行。有很多的选择,控制排序:

Option 描述
-n Sort numerically (example: 10 will sort after 2), ignore blanks and tabs.
-r Reverse the order of sort.
-f Sort upper- and lowercase together.
+x Ignore first x fields when sorting.

超过两个命令可以链接到一个管道。以先前的管道使用grep的例子,我们可以进一步在August 修改的文件大小顺序进行排序。 

下面的管道由命令ls,grep和排序:

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

August 大小顺序修改这条管道在你的目录中的所有文件进行排序,并将它们打印到终端屏幕。行数字顺序排序选项+4Ñ跳过四个字段(字段由空格分隔),然后排序。

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%)

屏幕将填补文本,其中包括按文件大小顺序排序的行了一屏。在屏幕底部是更迅速,在那里你可以通过排序的文本键入一个命令来移动。

当你完成这个屏幕上,可以使用任何的讨论更多程序中列出的命令。