1. 程式人生 > >以cat為例講述更高效的命令列使用方式

以cat為例講述更高效的命令列使用方式

以cat為例講述更高效的命令列使用方式

cat 是 unix 中的一個基礎命令,你可以在很多基礎命令學習書籍的例子中看到它。cat 屬於檢視檔案內容的命令,與它功能相似的一個命令是 tac,只是這個命令從後向前輸出檔案內容。

一般情況下,我們經常需要查詢檔案中的特定內容,這時我們可以先通過 cat 來讀取檔案,並將檔案內容通過匿名管道傳送到子程序中進行處理。這是一個常見的解決方案,但這個方案並不高效。在普通情況下也許這點並不重要,但在處理多個檔案時就顯得相對重要了。

下面以一個具體的例子來講。有一天,我們需要判斷系統中是否存在指定使用者,我們可以通過在系統資料檔案 /etc/passwd 中查詢使用者名稱的方式來確定。具體的命令如下:

cat /etc/passwd | grep 'username'

上述命令有著這樣的流程:

首先,shell 讀取命令列,發現 | (pipe line)則建立一個匿名管道。shell 將為每個命令建立獨立的程序。在這個例子中,shell 首先建立 cat 命令的執行任務,然後建立 grep 的執行任務。shell 使用建立好的匿名管道將 cat 命令的標準輸出連線到 grep 命令的標準輸入,這就是所有的過程。

在上述命令中,shell 需要建立兩個任務,並建立匿名管道來完成程序間通訊工作,這兩個程序分別寫、讀管道的一端來完成資料的傳輸任務。這是匿名管道的一個經典使用方式,十分常見。

儘管我們經常這樣使用,但這種方式其實是對 cat 命令與管道的濫用。unix 中同過多個命令之間的組合來完成複雜的功能,這是 unix 體系結構的一大特徵,但這並不意味著你每次都需要這樣做。當能夠使用單個命令來完成上述過程時,你完全可以使用單個命令來實現。

對於 cat 命令的使用,當你需要檢視某些極短內容的檔案或者檢視檔案中的某些特殊字元時,你可以使用 cat 來完成,僅僅這一個命令就可以完成工作。當你需要在檔案中查詢特定字元的時候你可以使用 grep 、sed、awk 來完成。

應用於上述例子,你就可以使用如下命令列替換上述命令列,這是其中的一種方式。

grep 'username' /etc/passwd 

sed -n '/username/p' /etc/passwd

awk '/username/ {print $0}' /etc/passwd

單個命令的方式減少了多個任務建立與銷燬及使用程序間通訊的效能損耗,這可以稱為一種更高效的命令列使用方式。