位置:首頁 > 其他技術 > 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%)

屏幕將填補文本,其中包括按文件大小順序排序的行了一屏。在屏幕底部是更迅速,在那裡你可以通過排序的文本鍵入一個命令來移動。

當你完成這個屏幕上,可以使用任何的討論更多程序中列出的命令。