linux中管道以及重新導向 1:管道linux 系統的理念是彙集許多小程式,每個程式都有特殊的專長。負載的任務不是由大型軟體完成,而是由Shell的機制,組合許多小程式共同完成。 www.2cto.com 訊號在進程間傳送的只是一個訊號值,管道可以在進程間傳送大量的資料。管道機制的兩端必定串連著兩個進程,向管道中寫入資料的進程稱為寫管道進程,從管道中讀取資料的進程稱為讀管道進程。 LINUX管道機制是一種傳送方向固定的單向管道,一旦確定了其資料傳送方向就不能再更改。LINUX把管道看作是一種檔案,採用檔案管理的方法對管道進行管理。但管道與檔案的根本區別在於,管道不使用外存而是使用實體記憶體存放傳送的資料 INUX採用迴圈方式使用管道緩衝區,當L資料寫入緩衝區到達尾部後就繼續從頭部寫入。LINUX具名管道作為一種特殊檔案納入檔案系統,和一般檔案一樣有名字,在檔案系統的分類樹中有具名管道的目錄項,磁碟上有其對應的inode節點管道與普通檔案的區別,具名管道不使用命名磁碟的資料區存放資料而是使用記憶體緩衝區存放資料, 利用輸入/輸出重新導向 在Linux命令列模式中,如果命令所需的輸入不是來自鍵盤,而是來自指定的檔案,這就是輸入重新導向。同理,命令的輸出也可以不顯示在螢幕上,而是寫入到指定檔案中,這就是輸出重新導向。 接下來看看標準輸入/輸出重新導向在構造一條Linux命令中的實際應用。 1.輸入重新導向和輸出重新導向 # wc aa.txt# ls > home.txt 第一條命令將檔案aa.txt作為wc命令的輸入,統計出aa.txt的行數、單詞數和字元數。第二條命令將ls命令的輸出儲存在一個名為home.txt的檔案中。如果>符號後邊的檔案已存在,那麼這個檔案將被重寫。 2.同時使用輸入和輸出重新導向 # iconv -f gb18030 -t utf-8 new-aa.txt 這條命令裡同時用到了輸入重新導向(new-aa.txt)。aa.txt實際是一個gb18030編碼的檔案,而new-aa.txt則是將aa.txt的內容轉換成utf-8格式的新檔案。 利用管道利用Linux所提供的管道符“|”將兩個命令隔開,管道符左邊命令的輸出就會作為管道符右邊命令的輸入。連續使用管道意味著第一個命令的輸出會作為第二個命令的輸入,第二個命令的輸出又會作為第三個命令的輸入,依此類推。下面來看看管道是如何在構造一條Linux命令中得到應用的。 1.利用一個管道# rpm -qa|grep licq 這條命令使用一個管道符“|”建立了一個管道。管道將rpm-qa命令的輸出(包括系統中所有安裝的RPM包)作為grep命令的輸入,從而列出帶有licq字元的RPM包來。4.利用多個管道這條命令使用一個管道符“|”建立了一個管道。管道將rpm-qa命令的輸出(包括系統中所有安裝的RPM包)作為grep命令的輸入,從而列出帶有licq字元的RPM包來。4.利用多個管道 # cat /etc/passwd | grep /bin/bash | wc -l 這條命令使用了兩個管道,利用第一個管道將cat命令(顯示passwd檔案的內容)的輸出送給grep命令,grep命令找出含有“/bin/bash”的所有行;第二個管道將grep的輸出送給wc命令,wc命令統計出輸入中的行數。這個命令的功能在於找出系統中有多少個使用者使用bash。 利用命令替換在Linux命令列模式下,當遇到一對“`”(上分割符)時,將首先執行“`”中間包含的命令,然後將其輸出結果作為參數代入命令列中,這就是命令替換了。它類似於輸入輸出的重新導向功能,但區別在於命令替換是將一個命令的輸出作為另外一個命令的參數。下面來看它的實際應用。 www.2cto.com 2.使用命令替換 # kill `/sbin/pidof smbd` 該命令將殺掉sshd的所有進程。這裡用pidof這個命令給出進程號,因為kill是針對進程號進行操作的。兩者通過命令替換,實現了只用一條命令就殺掉sshd所有進程的功能。 綜合應用 在理解和熟悉了前面的幾個技巧後,將它們綜合運用起來就是較高的技巧了。同時,一些常用的、且本身用法就比較複雜的Linux命令一定要熟練掌握。在構造Linux命令中常常用到的一些基礎的、重要的命令有grep、tr、sed、awk、find、cat和echo等,下面來看一些綜合應用的例子。 1. # man ls | col -b > ls.man.txt 這條命令同時運用了輸出重新導向和管道兩種技巧,作用是將ls的協助資訊轉成一個可以直接閱讀的文字檔。 www.2cto.com 2. # kill -9 `ps -ef | grep smbd | tr -s ' ' | awk -F' ' '{print$2}'` 這個例子的功能和上面的功能是一樣的,不過它不依賴pidof命令,使用的是多數Unix類系統中都有的命令,適用於更多的系統內容。但是它看起來更複雜一些,使用了三個管道和一次命令替換,另外使用了grep、tr和awk三個與字元操作相關的命令。 從前面的介紹可以看出,通過幾種技巧的組合,Linux命令可以完成複雜的功能。除此之外,還可以將這些命令組織到一個指令碼中來,加上函數、變數、判斷和迴圈等功能,再加入一些編程思想,就是功能更強大的Shell指令碼了。 重新導向:在linux中,希望將命令的輸出結果儲存在檔案中,或以檔案內容作為命令的參數,這時就需要用到重新導向。重新導向不使用系統的標準輸入連接埠,標準輸出連接埠或是標準錯誤連接埠,這時就需要用到重新導向。重新導向不是用標準的出入連接埠,標準輸出連接埠或是標準錯誤連接埠,而是進行重新的指定。重新導向有五種方式:輸出重新導向,輸入重新導向,錯誤重新導向,追加重新導向以及同時實現輸出和錯誤的重新導向。1:輸出重新導向。輸出重新導向,即將某一命令的輸出儲存到檔案中,如果存在相同的檔案,則覆蓋源檔案中的內容。 www.2cto.com 命令文法如下:命令 > 檔案使用輸出重新導向將目錄/boot的內容儲存到檔案/root/abcls /boot > /root/abccat /root/abc使用echo命令和輸出重新導向建立文字檔 /root/mm 內容是hello#echo hello > /root/mm#cat /root/mmhello 2:輸入重新導向。輸入重新導向,即將某一檔案的內容作為命令的輸入命令文法如下;命令 < 檔案使用輸入重新導向將檔案/root/mm的內容作為輸入讓cat命令執行#cat < /root/mmhello3:追加重新導向追加重新導向,即將某一命令執行的輸出添加到已存在的檔案中命令文法如下命令 >> 檔案#echo aaa > /root/a#echo bbb >> /root/a#cat /root/aaaabbb