UNIX 管道和過(guò)濾器

2018-08-12 22:12 更新

管道和過(guò)濾器

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

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

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

grep 命令

grep 程序用固定的模式搜索一個(gè)文件或多個(gè)文件。它的語(yǔ)法是:

$grep pattern file(s)

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

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

最簡(jiǎn)單的 grep 使用就是匹配由一個(gè)詞組成的模式。它可可以管道中使用,因此只有那些輸入行中包含一個(gè)給定的字符串,才會(huì)被發(fā)送到標(biāo)準(zhǔn)輸出。如果你不指定 grep 讀取的文件名,它讀取標(biāo)準(zhǔn)輸入,這也是所有過(guò)濾程序工作的方式:

$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 命令中進(jìn)行使用:

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

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

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

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

sort 命令

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

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

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

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

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

如下管道包含了 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
$

上面的管道將會(huì)按照文件的大小對(duì) August 目錄下的文件進(jìn)行排序,并將它們打印到終端屏幕。排序參數(shù) +4n 會(huì)跳過(guò) 4 個(gè)字段(由空格分隔的字段),接著在按照數(shù)值順序?qū)π羞M(jìn)行排序。

pg 和 more 命令介紹

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

假設(shè)你有一個(gè)很長(zhǎng)的目錄列表。為了讓它容易閱讀,我們就要對(duì)它進(jìn)行排序,通過(guò)使用 more 命令對(duì)管道的輸出進(jìn)行處理:

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

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

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)