UNIX 管道和過濾器

2018-08-12 22:12 更新

管道和過濾器

你可以連接兩個命令在一起,這樣一個程序的輸出就可以作為下一個程序的輸入。兩個或兩個以上的命令以這種方式連接形成一個管道。

為了形成管道,在同一行中利用一個豎線(|)將兩個命令隔開。

如果一個程序?qū)⒘硪粋€程序的輸出作為輸入數(shù)據(jù),接著對輸入的數(shù)據(jù)執(zhí)行一些操作,并將結(jié)果寫入標準輸出,它就稱為一個過濾器。

grep 命令

grep 程序用固定的模式搜索一個文件或多個文件。它的語法是:

$grep pattern file(s)

“grep” 這個名字來源于 ed(UNIX 行編輯器)命令,g/re/p 這意味著“利用正則表達式進行全局搜索并打印所有包含它的行?!?/p>

正則表達式是一些純文本 (例如,一個詞) 和 / 或特殊字符,它被用于模式匹配。

最簡單的 grep 使用就是匹配由一個詞組成的模式。它可可以管道中使用,因此只有那些輸入行中包含一個給定的字符串,才會被發(fā)送到標準輸出。如果你不指定 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
$

如下是各種可選的參數(shù),你可以在 grep 命令中進行使用:

參數(shù) 描述
-v 打印所有沒有匹配的行。
-n 打印所有成功匹配的行和行號。
-l 打印匹配的文件名和匹配的行("l"來自字母 letter)。
-c 僅僅打印成功匹配到行的個數(shù)。
-i 同時匹配大小寫。

接下來,讓我們使用一個正則表達式,它讓 grep 命令找到包含 “carol” 字母的行,緊隨其后的可以是零個或多個字母,正則表達式中表示方法是 “.*”),之后接著是 “Aug” 字符。

如下是使用 -i 參數(shù),表示對字母大小寫不敏感:

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

sort 命令

sort 命令是按字母順序或者數(shù)字順序?qū)π形谋具M行排序。下面的示例是對 food 文件中的文本進行排序:

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

sort 命令默認是按字母順序進行排序。有很多可選參數(shù),可以控制排序:

參數(shù)描述
-n 數(shù)值順序進行排序 (例如: 10 將會被排到 2 之后),忽略空格和 tab 符。
-r 將排序的順序反轉(zhuǎn)。
-f 將大小寫排在一起。
+x 排序的時候忽略第一個 x 字段。

兩個或者兩個以上的命令就可以形成管道。拿前面提到的 grep 命令為例,我們可以按照文件的大小進一步對 August 文件進行排序。

如下管道包含了 ls,grep,和 sort 命令:

$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 目錄下的文件進行排序,并將它們打印到終端屏幕。排序參數(shù) +4n 會跳過 4 個字段(由空格分隔的字段),接著在按照數(shù)值順序?qū)π羞M行排序。

pg 和 more 命令介紹

過長的輸出通常會在您的屏幕上被壓縮,但是如果你通過使用 more 或 pg 命令作為過濾器,知道屏幕顯示滿了文本之后才會停止。

假設(shè)你有一個很長的目錄列表。為了讓它容易閱讀,我們就要對它進行排序,通過使用 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%)

屏幕將會充滿文本數(shù)據(jù),這些文本是按照文件大小順序的。在屏幕的底端是一個 more 命令,你可以敲入命令讓屏幕滾動顯示更多的數(shù)據(jù)。

當屏幕上顯示完成的時候,你接著可以使用在討論部分說的任何關(guān)于 more 程序的命令。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號