在linux中,管道符是“|”,主要用於將兩個或多個命令連接到一起,把一個命令的輸出作為下一個命令的輸入;語法“command1 | command2 [ | commandN... ]”,“|”符左邊指令的輸出會作為“|”符號右邊指令的輸入。管道符是可以連續使用的,第一個指令的輸出會作為第二個指令的輸入,第二個指令的輸出又會作為第三個指令的輸入,依此類推。
本教學操作環境:linux7.3系統、Dell G3電腦。
Shell 還有一個功能,就是可以將兩個或多個命令(程式或進程)連接在一起,把一個命令的輸出當作下一個命令的輸入,以這種方式連接的兩個或多個指令就形成了管道(pipe)。
Linux 管道使用豎線|
連接多個命令,這稱為管道符。
command1 | command2 command1 | command2 [ | commandN... ]
當在兩個指令之間設定管道時,管道符|左邊指令的輸出就變成了右邊指令的輸入。只要第一個指令向標準輸出寫入,而第二個指令是從標準輸入讀取,那麼這兩個指令就可以形成一個管道。大部分的 Linux 指令都可以用來形成管道。
管道符是可以連續使用的,第一個指令的輸出會作為第二個指令的輸入,第二個指令的輸出又會作為第三個指令的輸入,依此類推。
這裡需要注意,command1 必須有正確輸出,而command2 必須可以處理command2 的輸出結果;而且command2 只能處理command1 的正確輸出結果,不能處理command1 的錯誤訊息。
舉個栗子:對hello.sh檔案進行排序去重以後找出包含"better"的行
指令為:cat hello.sh | sort | uniq | grep 'better'
首先使用cat指令查看文本,列印到螢幕上內容即為cat指令的輸出結果
[root@linuxforliuhj test]# cat hello.sh hello this is linux be better be better i am lhj hello this is linux i am lhj i am lhj be better i am lhj have a nice day have a nice day hello this is linux hello this is linux have a nice day zzzzzzzzzzzzzz dddddddd gggggggggggggggggggg [root@linuxforliuhj test]#
【2】第二道工序-排序
將前面cat指令輸出的結果經由管道丟給sort指令,所以sort指令是對前面cat指令輸出的文字進行排序
[root@linuxforliuhj test]# cat hello.sh | sort be better be better be better dddddddd gggggggggggggggggggg have a nice day have a nice day have a nice day hello this is linux hello this is linux hello this is linux hello this is linux i am lhj i am lhj i am lhj i am lhj zzzzzzzzzzzzzz [root@linuxforliuhj test]#
【3】第三道工序-去重
前面介紹uniq的文章中提到,sort跟uniq結合使用才能有效去重,所以透過管道將sort處理後輸出的文本丟給uniq處理,所以uniq處理的是排序好的文本,可以進行有效去重
[root@linuxforliuhj test]# cat hello.sh | sort | uniq be better dddddddd gggggggggggggggggggg have a nice day hello this is linux i am lhj zzzzzzzzzzzzzz [root@linuxforliuhj test]#
【4】第四道工序-過濾
最後一步過濾則同樣是將前面指令即uniq指令處理後輸出的文字進行過濾
[root@linuxforliuhj test]# cat hello.sh | sort | uniq | grep 'better' be better [root@linuxforliuhj test]#
##重點來了!
重點來了!
以上的cat、sort、uniq、grep等指令皆支援管道符,是因為這些指令皆可從標準輸入讀取要處理的文字(即從標準輸入中讀取參數);而對於部分命令,例如rm、kill等命令則不支援從標準輸入中讀取參數,只支援從命令列讀取參數(即rm命令後面必須指定刪除的檔案或目錄,kill指令後面必須要指定殺死的進程號等)
那什麼樣的指令支援管道,什麼樣的指令不支援管道呢?一般情況下,處理文字的指令,例如sort、uniq、grep、awk、sed等指令皆支援管道;像rm、ls這類的不是處理文字的指令均不支援管道
當rm後面不指定刪除的檔案時,則會報錯遺失參數,所以,rm等指令不支援從標準輸入讀取參數,只支援在命令列指定參數,也就是指定刪除的檔案。
[root@linuxforliuhj test]# cat hello.sh | sort be better be better be better dddddddd gggggggggggggggggggg have a nice day have a nice day have a nice day hello this is linux hello this is linux hello this is linux hello this is linux i am lhj i am lhj i am lhj i am lhj zzzzzzzzzzzzzz [root@linuxforliuhj test]#登入後複製登入後複製
sort後面沒有參數時,則對管道符丟給它的前一個命令的輸出結果進行處理(即前一個命令的標準輸出作為本次命令的標準輸入)[root@linuxforliuhj test]# ls beifen.txt hello.sh mk read.ln read.sh read.txt sub.sh [root@linuxforliuhj test]# ls | grep read.sh read.sh [root@linuxforliuhj test]# ls | grep read.sh | rm rm: missing operand Try 'rm --help' for more information. [root@linuxforliuhj test]#登入後複製
標準輸入和命令列參數那個優先?
[root@linuxforliuhj test]# cat a.txt aaaa dddd cccc bbbb [root@linuxforliuhj test]# cat b.txt 1111 3333 4444 2222 [root@linuxforliuhj test]#
[root@linuxforliuhj test]# cat a.txt | sort aaaa bbbb cccc dddd [root@linuxforliuhj test]#
[root@linuxforliuhj test]# cat a.txt | sort b.txt 1111 2222 3333 4444 [root@linuxforliuhj test]#
[root@linuxforliuhj test]# cat a.txt | sort b.txt - 1111 2222 3333 4444 aaaa bbbb cccc dddd [root@linuxforliuhj test]#
[root@linuxforliuhj test]# sort a.txt b.txt 1111 2222 3333 4444 aaaa bbbb cccc dddd [root@linuxforliuhj test]#
思考:对于rm、kill等命令,我们写脚本时常常会遇到需要查询某个进程的进程号然后杀掉该进程,查找某个文件然后删除它这样的需求,该怎么办呢?那就用xargs吧!
相关推荐:《Linux视频教程》
以上是linux中管道符是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!