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

下載本文檔

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

文檔簡介

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

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

3、別 這是一個實際的案例,一個Linux系統(tǒng)的管理員以超級用戶的身份執(zhí)行了如下命令: # cd /usr/bin # ls less 第一個命令是將當前目錄切換到了大多數(shù)程序所存放的目錄,而第二個命令是告訴Shell用ls命令的輸出重寫文件less。因為/usr/bin目錄已經(jīng)包含了名稱為less(less程序)的文件,第二個命令用ls輸出的文本重寫了less程序,因此破壞了文件系統(tǒng)中的less程序。 這是使用重定向操作符誤操作重寫文件的一個教訓(xù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ù)庫備份文件拷貝到遠程的名稱為backupserver的備份服務(wù)器。 上述三個命令依次地運行。然而,如果使用管道的話

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

6、起。12.1.3 實例:使用管道連接程序 通過本章前面內(nèi)容的學習,我們已經(jīng)知道了,管道符是豎線“|”,使用這一操作符我們就可以將命令連接起來。例如,在下面的例子中,我們將ls命令的輸出發(fā)送到grep命令: $ ls | grep data.txt 上述命令是查看文件data.txt是否存在于當前目錄下。 我們可以在命令的后面使用命令的選項或參數(shù)。例如,我們查看當前目錄下是否有.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 下面我們再來通過一些實例來學習,如何使用管道來連接程序。12.1.4 實例:管道中的輸入重定向 輸入重定

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

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

10、行排序。 split 用于將文件分割成塊。 strings 用于打印文件中可打印的字符串。 tac 與cat命令的功能相反,用于倒序地顯示文件或連接文件。 tail 用于顯示文件的結(jié)尾部分。 tee 用于從標準輸入讀取內(nèi)容并寫入到標準輸出和文件。 tr 用于轉(zhuǎn)換或刪除字符。 uniq 用于報告或忽略重復(fù)的行。 wc 用于打印文件中的總行數(shù)、單詞數(shù)或字節(jié)數(shù)。 接下來,我們來學習如何在管道中使用這些命令。12.2.1 實例:在管道中使用awk命令 我們將在第14章詳細介紹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命令,它只打印命令的前幾行輸出。默認的輸出行數(shù)為10行。12.2.6 實例:在管道中使用paste命令 paste命令用于合并文件的行,當然,它也可以通過管道接收其它命令的輸出,并對其內(nèi)容進行相應(yīng)的合并處理

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

13、ings命令用于打印文件中的可打印字符串,常用來與grep命令配合使用,在二進制文件中查找字符串。12.2.11 實例:在管道中使用tail命令 tail命令用于打印文件的最后幾行,同樣,也可以通過管道顯示其它命令輸出的最后幾行內(nèi)容。12.2.12 實例:在管道中使用tee命令 tee命令用于(在同一時間)存儲和查看任意其它命令的輸出。使用tee命令,你可以從一個輸入流讀取輸入,并分隔輸出流到兩個重定向,所以輸出即顯示在屏幕(標準輸出)上也同樣重定向到一個文件中。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é)一下本章所學的主要知識: 管道:將兩個或多個程序連接到一起,以使一個程序的輸出可以變?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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論