共計 3597 個字符,預計需要花費 9 分鐘才能閱讀完成。
本文丸趣 TV 小編為大家詳細介紹“linux 管道符的作用是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“linux 管道符的作用是什么”文章能幫助大家解決疑惑,下面跟著丸趣 TV 小編的思路慢慢深入,一起來學習新知識吧。
在 linux 中,管道符“|”的作用是連接多條指令,前一條指令的輸出流會作為后一條指令的操作對象,其命令格式為“指令 1 | 指令 2 | …”,該命令的后一條指令,必須能夠接收標準輸入流命令才能執行。管道符主要用于多重命令處理,前面命令的打印結果作為后面命令的輸入。
管道是 Linux 中很重要的一種通信方式,是把一個程序的輸出直接連接到另一個程序的輸入。常說的管道多是指無名管道,無名管道只能用于具有親緣關系的進程之間,這是它與有名管道的最大區別。
有名管道叫 named pipe 或者 FIFO(先進先出),可以用函數 mkfifo() 創建。
linux 中的 | 管道符
| 管道符的作用是連接多條指令,前一條指令的輸出流會作為后一條指令的操作對象,其命令格式為“指令 1 | 指令 2 | …”,該命令的后一條指令,必須能夠接收標準輸入流命令才能執行。
管道命令的操作符是:”|”,它只能處理由前面一條指令傳出的正確輸出信息,對錯誤信息是沒有直接處理能力的。然后,傳遞給下一條指令,作為操作對象。
語法:
指令 1 | 指令 2 | …
管道符主要用于多重命令處理,前面命令的打印結果作為后面命令的輸入。簡單點說就是,就像工廠的流水線一樣,進行完一道工序后,繼續傳送給下一道工序處理…
舉個栗子:對 hello.sh 文件進行排序去重以后找出包含 better 的行
命令為:cat hello.sh | sort | uniq | grep better’
查看文本
排序
去重
過濾
【1】第一道工序——查看文本
首先使用 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 | 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]#
【3】第三道工序——去重
前面介紹 uniq 的文章中提到,sort 跟 uniq 結合使用才能有效去重,所以通過管道將 sort 處理后輸出的文本丟給 uniq 處理,所以 uniq 處理的是排序好的文本,可以進行有效去重
[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]#
【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 這類的不是處理文本的命令均不支持管道
[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]#
sort 后面沒有參數時,則對管道符丟給它的前一個命令的輸出結果進行處理(即前一個命令的標準輸出作為本次命令的標準輸入)
[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]#
當 rm 后面不指定刪除的文件時,則會報錯丟失參數,所以,rm 等命令不支持從標準輸入讀取參數,只支持在命令行指定參數,即指定刪除的文件。
標準輸入和命令行參數那個優先?
有如下兩個文件
[root@linuxforliuhj test]# cat a.txt aaaa
bbbb[root@linuxforliuhj test]# cat b.txt 1111333344442222[root@linuxforliuhj test]#
執行命令:cat a.txt | sort
[root@linuxforliuhj test]# cat a.txt | sortaaaa
dddd[root@linuxforliuhj test]#
當 sort 的命令行參數為空時,默認使用前一個命令的輸出結果作為本次命令的輸入
執行命令:cat a.txt | sort b.txt
[root@linuxforliuhj test]# cat a.txt | sort b.txt 1111222233334444[root@linuxforliuhj test]#
可以看到,當 sort 的命令行參數(此處為 b.txt)不為空時,sort 不會讀取標準輸入里的參數,而時讀取命令行參數
執行命令:cat a.txt | sort b.txt –
[root@linuxforliuhj test]# cat a.txt | sort b.txt -1111222233334444aaaa
dddd[root@linuxforliuhj test]#
– 表示標準輸入,即命令 cat a.txt 的輸出,相當與對文件 b.txt 和標準輸入一起進行排序,相當于 sort a.txt b.txt
[root@linuxforliuhj test]# sort a.txt b.txt1111222233334444aaaa
dddd[root@linuxforliuhj test]#
讀到這里,這篇“linux 管道符的作用是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注丸趣 TV 行業資訊頻道。