在linux中,管道符「|」的作用是連接多條指令,前一條指令的輸出流會作為後一條指令的操作對象,其命令格式為「指令1 | 指令2 | … ”,該命令的後一條指令,必須能夠接收標準輸入流命令才能執行。管道符主要用於多重命令處理,前面命令的列印結果作為後面命令的輸入。
本教學操作環境:linux7.3系統、Dell G3電腦。
管道是Linux中很重要的一種通訊方式,是把一個程式的輸出直接連接到另一個程式的輸入。常說的管道多是指無名管道,無名管道只能用於具有親緣關係的進程之間,這是它與有名管道的最大區別。
有名管道叫named pipe或FIFO(先進先出),可以用函數mkfifo()來建立。
|
管道符的作用是連接多條指令,前一條指令的輸出流會作為後一條指令的操作對象,其命令格式為“指令1 | 指令2 | …”,該命令的後一條指令,必須能夠接收標準輸入流命令才能執行。
管道命令的操作符是:“|
”,它只能處理由前面一條指令傳出的正確輸出訊息,對錯誤訊息是沒有直接處理能力的。然後,傳遞給下一指令,作為操作物件。
語法:
指令1 | 指令2 | …
管道符主要用於多重指令處理,前面指令的列印結果作為後面指令的輸入。簡單點說就是,就像工廠的流水線一樣,進行完一道工序後,繼續傳送給下一道工序處理…
舉個栗子:對hello.sh檔進行排序去重以後找出包含"better"的行
指令為:cat hello.sh | sort | uniq | grep 'better'
[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]#
[root@linuxforliuhj test]# cat hello.sh | sortbe 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]#
[root@linuxforliuhj test]# cat hello.sh | sort | uniqbe better dddddddd gggggggggggggggggggg have a nice day hello this is linux i am lhj zzzzzzzzzzzzzz[root@linuxforliuhj test]#
[root@linuxforliuhj test]# cat hello.sh | sort | uniq | grep 'better'be better[root@linuxforliuhj test]#
#重點來了!
重點來了!
以上的cat、sort、uniq、grep等指令皆支援管道符,是因為這些指令皆可從標準輸入讀取要處理的文字(即從標準輸入中讀取參數);而對於部分命令,例如rm、kill等命令則不支援從標準輸入中讀取參數,只支援從命令列讀取參數(即rm命令後面必須指定刪除的檔案或目錄, kill指令後面必須要指定殺死的行程號碼等)
那什麼樣的指令支援管道,什麼樣的指令不支援管道呢?sort後面沒有參數時,則對管道符丟給它的前一個命令的輸出結果進行處理(即前一個命令的標準輸出作為本次命令的標準輸入)一般情況下,處理文字的指令,例如sort、uniq、grep、awk、sed等指令皆支援管道;像rm、ls這類的不是處理文字的指令均不支援管道
[root@linuxforliuhj test]# cat hello.sh | sortbe 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]#登入後複製登入後複製
[root@linuxforliuhj test]# lsbeifen.txt hello.sh mk read.ln read.sh read.txt sub.sh[root@linuxforliuhj test]# ls | grep read.shread.sh[root@linuxforliuhj test]# ls | grep read.sh | rmrm: 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 1111333344442222[root@linuxforliuhj test]#
[root@linuxforliuhj test]# cat a.txt | sortaaaa bbbb cccc dddd[root@linuxforliuhj test]#
[root@linuxforliuhj test]# cat a.txt | sort b.txt 1111222233334444[root@linuxforliuhj test]#
[root@linuxforliuhj test]# cat a.txt | sort b.txt -1111222233334444aaaa bbbb cccc dddd[root@linuxforliuhj test]#
[root@linuxforliuhj test]# sort a.txt b.txt1111222233334444aaaa bbbb cccc dddd[root@linuxforliuhj test]#
思考:对于rm、kill等命令,我们写脚本时常常会遇到需要查询某个进程的进程号然后杀掉该进程,查找某个文件然后删除它这样的需求,该怎么办呢?那就用xargs吧!
相关推荐:《Linux视频教程》
以上是linux管道符有什麼作用的詳細內容。更多資訊請關注PHP中文網其他相關文章!