xargs 地下管道 促使我去思考,管道 的具象含義是什麼。 用管道符號可以組合出更實用的內容:優先順序為 任務數量為 2。 其中 命令接收一個參數,並將其內容列印到標準輸出:當前屏幕。 本例中 "sample.txt" 內容並沒有輸出到屏幕上,內容被重定向到管道命令 緩存中了。 而 命令需要兩個參數 ...
xargs - 地下管道
xargs
促使我去思考,管道 |
的具象含義是什麼。
$ cat sample.txt
Things to do today:
Low:Go grocery shopping
High:Return movie
High:Clear level 3 in Alien vs. Predator
Medium:Pick up clothes from dry cleaner
用管道符號可以組合出更實用的內容:優先順序為 High
任務數量為 2。
$ cat sample.txt | grep 'High' | wc -l
2
其中 cat
命令接收一個參數,並將其內容列印到標準輸出:當前屏幕。
本例中 sample.txt 內容並沒有輸出到屏幕上,內容被重定向到管道命令 |
緩存中了。
而 grep
命令需要兩個參數,例如:grep 'Frank' name-list.csv
,將從 name-list.csv 文件中查詢有關鍵字 Frank 的行。
本例中第二個關鍵字是缺失的,grep
實際是從管道緩存裡面讀取了數據。
$ cat sample.txt | grep 'High' | wc -l
拼接命令的最後一個參數預設從管道里讀取數據。
以上示例中 wc -l
命令如何讀取從 grep
傳到管道的數據,你就很容易想象了。
管道命令
|
是如此優雅的讓多個命令合作無間,就像一個充滿魅力的領航員,帶領大家前進。
但一些早期命令,例如 rm
,cp
等是不支持管道命令。你永遠無法使用類似 cat rm.list | rm
的方式刪除 rm.list 中列出的文件。
$ ls -l
1.txt
2.txt
3.txt
rm.list
$ cat rm.list
1.txt
2.txt
3.txt
很遺憾,rm
命令就是無法從管道中讀取數據。
管道命令 |
是如此優雅,以至於那些不支持從管道讀取數據的命令都很令人惱火(大多是早期命令)。這些命令就像反抗軍,在地下悄悄的、分散著活動著。
而 xargs
就像 Neo
一樣,橫空出世,將以一己之力整合這些地下武裝,我稱之為:The One, 中文名:地下管道。
$ cat rm.list | xargs rm
xargs
獲取管道數據(同樣作為自己的最後一個參數)並組織成 rm
命令的參數,再調用 rm
,完成工作。
這就是一個經典的回調。
function xargs(cmd, args...) {
cmd args...
}
xargs(rm, rm.list)
向 xargs
中傳進命令和該命令執行需要的參數,函數體內中再封裝,讓這個命令能正確讀取參數,最後執行命令,完成工作。
$ cat rm.list | xargs cat
from 1.txt
from 2.txt
from 3.txt
上例中,xargs
讀取管道內容(一些列文件名),在執行 cat
命令時,將這些文件名作為參數傳進 cat
,由此cat
一次性讀取了三個文件裡面的內容。
試想如果rm.list
內容組織是以,
分割(1.txt,2.txt,3.txt),cat
似乎就無法讀取了。
你可能敏銳的感覺到了,如何組織好數據以讓回調的命令能正確的作為參數讀取,是使用好 xargs
的關鍵。
(xargs
提供了很多選項,讓你儘快能舒服的組織好這些參數。這些大家隨手可搜,多加練習即可。)
最後:xargs
就像 The One (地下管道),組織起那些反叛的命令軍,抵抗到底。