linux如何建立管道檔案
說起Linux的管道命令,肯定Linuxer們會說,簡單,不就|和><三個符號嗎?
其中|表示將上一個命令的輸出傳遞到下一個命令。
>表示將命令結果輸入到檔案,<表示將檔案內容提取作為命令的輸入引數。
這時,一位隱於角落的老者喃喃道,不不,“你知道茴香豆的回字一共是有四種寫法的”(魯迅《孔乙己》,現在已經從中學教材中刪除)。
Linux的文化就是將眾多晦澀難懂的小工具組合起來,從而產生連原作者都無法想象的威力,而這些小工具往往2個字母,無數個命令引數,學習曲線頗為陡峭。而這組合的方式就是利用管道,所以在Linux的規範中,小工具們產生的格式一定是純文字,這樣後面的工具才能正確地解讀。那管道的寫法究竟幾種方式,只是用|把命令們串起來就可以了嗎?
我們使用find和grep兩個命令做一個示範:
find命令按照檔名稱找出需要的檔案。
grep命令從檔案內容中篩選出符合要求的部分。
第一式,使用find的exec引數。
find 。 -type f -name “cron*” -exec grep -l log {} \;
exec很強大,有時可以解決你用其他方式時非常彆扭的情況。
第二式,使用xargs大法,這個工具使用得非常多。
find 。 -type f -name “cron*” | xargs grep -l log
xargs為什麼以x開頭呢,這個命令類似於excel的轉置,將前面的列,變為後面的行。這樣其實就是讓後面的命令根據前面找的檔案逐條執行。
這時,有小夥伴要問了,我有時引數並不在最後一個啊,如果在中間怎麼辦,放心,xargs有-I(大i)引數,可以讓你生成帶變數的命令:
find 。 -type f -name “cron*” | xargs -I % grep log % -li
宣告%作為變數,代表前面命令的結果,然後在grep中使用%變數。
第三式,使用$()來優先求結果。
grep -l log $(find 。 -type f -name “cron*”)
$()將優先計算,隨後結果和grep共同構成最終的命令。但是要注意一個大坑,如果find找不出檔案,grep命令將會無限執行,需要按ctrl+c結束。
好了,大概就講這麼多了,如果大家覺得還有更加奇妙的寫法,歡迎在下方留言。
原創版權,如引用需要註明來源和連結。