第12章管道與過濾器_第1頁
第12章管道與過濾器_第2頁
第12章管道與過濾器_第3頁
第12章管道與過濾器_第4頁
第12章管道與過濾器_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第12章 管道和過濾器 通過前一章的學(xué)習(xí),我們已經(jīng)知道了怎樣從文件重定向輸入,和重定向輸出到文件。Shell還有一種功能,就是可以將兩個或多個程序連接到一起,以使一個程序的輸出變?yōu)橄乱粋€程序的輸入,以這種方式連接的兩個或多個程序就形成了管道。管道通常用于執(zhí)行一些復(fù)雜的數(shù)據(jù)處理操作。這些命令之間使用控制操作符(管道符)“|”(豎線)連接。管道的語法格式如下所示: $ command1 | command2 $ command1 | command2 | commandN 當(dāng)在兩個命令之間設(shè)置管道時,管道符“|”左邊命令的標(biāo)準(zhǔn)輸出就變?yōu)榱斯艿婪皘”右邊命令的標(biāo)準(zhǔn)輸入。只要第一個命令向標(biāo)準(zhǔn)輸出寫入

2、,而第二個命令是從標(biāo)準(zhǔn)輸入讀取,那么這兩個命令就可以形成一個管道。大部分的Linux命令都可以用來形成管道。12.1.1 操作符|和之間的區(qū)別 乍看起來,可能很難理解,由管道符|執(zhí)行的重定向與由重定向操作符執(zhí)行的重定向之間有什么不同。簡單地說,重定向操作符將命令與文件連接,而管道符|將第一個命令的輸出與第二個命令的輸入連接。即,其含義的區(qū)別如下所示: $ command1 file1 $ command1 | command2 大部分的人學(xué)習(xí)管道時會嘗試如下命令,我們來看一下會發(fā)生什么: $ command1 command2 答案是,有時嘗試的結(jié)果將會很糟糕。12.1.1 操作符|和之間的區(qū)

3、別 這是一個實際的案例,一個Linux系統(tǒng)的管理員以超級用戶的身份執(zhí)行了如下命令: # cd /usr/bin # ls less 第一個命令是將當(dāng)前目錄切換到了大多數(shù)程序所存放的目錄,而第二個命令是告訴Shell用ls命令的輸出重寫文件less。因為/usr/bin目錄已經(jīng)包含了名稱為less(less程序)的文件,第二個命令用ls輸出的文本重寫了less程序,因此破壞了文件系統(tǒng)中的less程序。 這是使用重定向操作符誤操作重寫文件的一個教訓(xùn),所以在使用它時要謹(jǐn)慎。12.1.2 為什么使用管道 我們先看下面一組命令,使用mysqldump這個數(shù)據(jù)庫備份程序來備份一個叫做wiki的數(shù)據(jù)庫: $

4、 mysqldump -u root -p password wiki /tmp/wikidb.backup $ gzip -9 /tmp/wikidb.backup $ scp /tmp/wikidb.backup userbackupserver:/backup/mysql/ 上述這組命令主要做了如下內(nèi)容: mysqldump命令用于將名稱為wiki的數(shù)據(jù)庫備份到文件/tmp/wikidb.backup。 gzip命令用于壓縮大的數(shù)據(jù)庫文件以節(jié)省磁盤空間。 scp命令用于將數(shù)據(jù)庫備份文件拷貝到遠(yuǎn)程的名稱為backupserver的備份服務(wù)器。 上述三個命令依次地運行。然而,如果使用管道的話

5、,你就可以將mysqldump命令與gzip命令和ssh命令相連接,這樣就避免了創(chuàng)建臨時文件/tmp/wikidb.backup,而且可以同時執(zhí)行這些命令并達(dá)到相同的效果。12.1.2 為什么使用管道 使用管道后的命令如下所示: $ mysqldump -u root -ppassword wiki | gzip -9 | ssh userbackupserver cat /home/user/mysql/wikidb.gz 上述使用管道的命令具有如下特點: 命令的語法緊湊并且使用簡單。 通過使用管道,將三個命令串聯(lián)到了一起就完成了遠(yuǎn)程mysql備份的復(fù)雜任務(wù)。 從管道輸出的標(biāo)準(zhǔn)錯誤會混合到一

6、起。12.1.3 實例:使用管道連接程序 通過本章前面內(nèi)容的學(xué)習(xí),我們已經(jīng)知道了,管道符是豎線“|”,使用這一操作符我們就可以將命令連接起來。例如,在下面的例子中,我們將ls命令的輸出發(fā)送到grep命令: $ ls | grep data.txt 上述命令是查看文件data.txt是否存在于當(dāng)前目錄下。 我們可以在命令的后面使用命令的選項或參數(shù)。例如,我們查看當(dāng)前目錄下是否有.bashrc文件: $ ls -al | grep .bashrc -rwxr-xr-x 1 yantaol group 12 Oct 10 12:52 .bashrc 管道符“|”與兩側(cè)的命令之間也不可以不存在空格。比

7、如,上述命令還可以寫為類似如下所示: $ ls -al|grep .bashrc -rwxr-xr-x 1 yantaol group 12 Oct 10 12:52 .bashrc12.1.3 實例:使用管道連接程序 然而,我還是推薦在管道符“|”和兩側(cè)的命令之間使用空格,以增加代碼的可讀性。 我們也可以重定向管道的輸出到一個文件。比如,我們將上述管道命令的輸出結(jié)果發(fā)送到文件/tmp/output.log中: $ ls -al | grep .bashrc /tmp/output.log 下面我們再來通過一些實例來學(xué)習(xí),如何使用管道來連接程序。12.1.4 實例:管道中的輸入重定向 輸入重定

8、向操作符可以在管道中使用,以用來從文件中獲取輸入。其語法類似如下所示: command1 input.txt | command2 command1 或?qū)⒐艿乐凶詈笠粋€命令的標(biāo)準(zhǔn)輸出進(jìn)行重定向。其語法類似如下所示: $ command1 | command2 | | commandN output.txt $ command1 output.txt 我們已經(jīng)知道,將幾個命令通過管道符組合在一起就形成一個管道。通常,通過這種方式被使用的命令就被稱為過濾器。過濾器會獲取輸入,通過某種方式修改其內(nèi)容,然后將其輸出。 簡單地說,過濾器可以概括為以下兩點: 如果一個linux命令是從標(biāo)準(zhǔn)輸入接收它的輸入

9、數(shù)據(jù),并在標(biāo)準(zhǔn)輸出上產(chǎn)生它的輸出數(shù)據(jù)(結(jié)果),那么這個命令就被稱為過濾器。 過濾器通常與Linux管道一起使用。 常用的被作為過濾器使用的命令如下所示: awk 用于文本處理的解釋性程序設(shè)計語言,通常被作為數(shù)據(jù)提取和報告的工具。 cut 用于將每個輸入文件(如果沒有指定文件則為標(biāo)準(zhǔn)輸入)的每行的指定部分輸出到標(biāo)準(zhǔn)輸出。 grep 用于搜索一個或多個文件中匹配指定模式的行。 tar 用于歸檔文件的應(yīng)用程序。 head 用于讀取文件的開頭部分(默認(rèn)是10行)。如果沒有指定文件,則從標(biāo)準(zhǔn)輸入讀取。 paste 用于合并文件的行。 sed 用于過濾和轉(zhuǎn)換文本的流編輯器。 sort 用于對文本文件的行進(jìn)

10、行排序。 split 用于將文件分割成塊。 strings 用于打印文件中可打印的字符串。 tac 與cat命令的功能相反,用于倒序地顯示文件或連接文件。 tail 用于顯示文件的結(jié)尾部分。 tee 用于從標(biāo)準(zhǔn)輸入讀取內(nèi)容并寫入到標(biāo)準(zhǔn)輸出和文件。 tr 用于轉(zhuǎn)換或刪除字符。 uniq 用于報告或忽略重復(fù)的行。 wc 用于打印文件中的總行數(shù)、單詞數(shù)或字節(jié)數(shù)。 接下來,我們來學(xué)習(xí)如何在管道中使用這些命令。12.2.1 實例:在管道中使用awk命令 我們將在第14章詳細(xì)介紹awk命令的使用,在這一節(jié)中,我們僅通過幾個簡單的實例來了解一下awk命令在管道中的使用。12.2.2 實例:在管道中使用cut

11、命令 cut命令被用于文本處理。你可以使用這個命令來提取文件中指定列的內(nèi)容。12.2.3 實例:在管道中使用grep命令 grep命令是在管道中比較常用的一個命令。12.2.4 實例:在管道中使用tar命令 tar命令是Linux系統(tǒng)中最常用的打包文件的程序。12.2.5 實例:在管道中使用head命令 有時,你不需要一個命令的全部輸出,可能只需要命令的前幾行輸出。這時,你就可以使用head命令,它只打印命令的前幾行輸出。默認(rèn)的輸出行數(shù)為10行。12.2.6 實例:在管道中使用paste命令 paste命令用于合并文件的行,當(dāng)然,它也可以通過管道接收其它命令的輸出,并對其內(nèi)容進(jìn)行相應(yīng)的合并處理

12、。12.2.7 實例:在管道中使用sed命令 我們將在第14章詳細(xì)介紹sed命令的使用,在這一節(jié)中我們將通過幾個簡單的實例來了解一下sed命令在管道中的使用。 sed命令是流編輯器(stream editor)的簡稱。12.2.8 實例:在管道中使用sort命令 sort命令用于對文本文件的行進(jìn)行排序,當(dāng)然,它也可以通過管道對其它命令輸出的行進(jìn)行排序。12.2.9 實例:在管道中使用實例:在管道中使用split命令命令 split命令用于將文件分割成塊,同樣,也可以通過管道將其它命令輸出的內(nèi)容分割成指定大小的塊并存入指定前綴的文件中。12.2.10 實例:在管道中使用strings命令 str

13、ings命令用于打印文件中的可打印字符串,常用來與grep命令配合使用,在二進(jìn)制文件中查找字符串。12.2.11 實例:在管道中使用tail命令 tail命令用于打印文件的最后幾行,同樣,也可以通過管道顯示其它命令輸出的最后幾行內(nèi)容。12.2.12 實例:在管道中使用tee命令 tee命令用于(在同一時間)存儲和查看任意其它命令的輸出。使用tee命令,你可以從一個輸入流讀取輸入,并分隔輸出流到兩個重定向,所以輸出即顯示在屏幕(標(biāo)準(zhǔn)輸出)上也同樣重定向到一個文件中。12.2.13 實例:在管道中使用tr命令 tr命令用于轉(zhuǎn)換和刪除字符。12.2.14 實例:在管道中使用uniq命令 uniq命令用于報告或刪除重復(fù)的行:12.2.15 實例:在管道中使用wc命令 wc命令用于統(tǒng)計包含在文本流中的字符數(shù)、單詞數(shù)和行數(shù)。12.3 小結(jié) 下面我們總結(jié)一下本章所學(xué)的主要知識: 管道:將兩個或多個程序連接到一起,以使一個程序的輸出可以變?yōu)橄乱粋€程序的輸入,以這種方式連接的兩個或多個程序就形成了管道。 重定向操作符將命令

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論