以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

單個命令的方式減少了多個任務創建與銷燬及使用進程間通信的性能損耗,這可以稱爲一種更高效的命令行使用方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章