linux中管道符是什么
在Linux中,管道符是“|”,主要用于將兩個(gè)或者多個(gè)命令連接到一起,把一個(gè)命令的輸出作為下一個(gè)命令的輸入;語(yǔ)法“command1 | command2 [ | commandN... ]”,“|”符左邊命令的輸出會(huì)作為“|”符右邊命令的輸入。管道符是可以連續(xù)使用的,第一個(gè)命令的輸出會(huì)作為第二個(gè)命令的輸入,第二個(gè)命令的輸出又會(huì)作為第三個(gè)命令的輸入,依此類(lèi)推。
本教程操作環(huán)境:linux7.3系統(tǒng)、Dell G3電腦。
Shell 還有一種功能,就是可以將兩個(gè)或者多個(gè)命令(程序或者進(jìn)程)連接到一起,把一個(gè)命令的輸出作為下一個(gè)命令的輸入,以這種方式連接的兩個(gè)或者多個(gè)命令就形成了管道(pipe)。
Linux 管道使用豎線|
連接多個(gè)命令,這被稱(chēng)為管道符。
command1 | command2 command1 | command2 [ | commandN... ]
當(dāng)在兩個(gè)命令之間設(shè)置管道時(shí),管道符|左邊命令的輸出就變成了右邊命令的輸入。只要第一個(gè)命令向標(biāo)準(zhǔn)輸出寫(xiě)入,而第二個(gè)命令是從標(biāo)準(zhǔn)輸入讀取,那么這兩個(gè)命令就可以形成一個(gè)管道。大部分的 Linux 命令都可以用來(lái)形成管道。
管道符是可以連續(xù)使用的,第一個(gè)命令的輸出會(huì)作為第二個(gè)命令的輸入,第二個(gè)命令的輸出又會(huì)作為第三個(gè)命令的輸入,依此類(lèi)推。
這里需要注意,command1 必須有正確輸出,而 command2 必須可以處理 command2 的輸出結(jié)果;而且 command2 只能處理 command1 的正確輸出結(jié)果,不能處理 command1 的錯(cuò)誤信息。
舉個(gè)栗子:對(duì)hello.sh文件進(jìn)行排序去重以后找出包含"better"的行
命令為:cat hello.sh | sort | uniq | grep 'better’
- 查看文本
- 排序
- 去重
- 過(guò)濾
【1】第一道工序——查看文本
首先使用cat命令查看文本,打印到屏幕上內(nèi)容即為cat命令的輸出結(jié)果
[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命令輸出的結(jié)果通過(guò)管道丟給sort命令,所以sort命令是對(duì)前面cat命令輸出的文本進(jìn)行排序
[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結(jié)合使用才能有效去重,所以通過(guò)管道將sort處理后輸出的文本丟給uniq處理,所以u(píng)niq處理的是排序好的文本,可以進(jìn)行有效去重
[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】第四道工序——過(guò)濾
最后一步過(guò)濾則同樣是將前面命令即uniq命令處理后輸出的文本進(jìn)行過(guò)濾
[root@linuxforliuhj test]# cat hello.sh | sort | uniq | grep 'better' be better [root@linuxforliuhj test]#
重點(diǎn)來(lái)了!
重點(diǎn)來(lái)了!
重點(diǎn)來(lái)了!
以上的cat、sort、uniq、grep等命令均支持管道符,是因?yàn)檫@些命令均可從標(biāo)準(zhǔn)輸入中讀取要處理的文本(即從標(biāo)準(zhǔn)輸入中讀取參數(shù));而對(duì)于部分命令,例如rm、kill等命令則不支持從標(biāo)準(zhǔn)輸入中讀取參數(shù),只支持從命令行中讀取參數(shù)(即rm命令后面必須指定刪除的文件或者目錄,kill命令后面必須要指定殺死的進(jìn)程號(hào)等)
那什么樣的命令支持管道,什么樣的命令不支持管道呢?
一般情況下,處理文本的命令,例如sort、uniq、grep、awk、sed等命令均支持管道;像rm、ls這類(lèi)的不是處理文本的命令均不支持管道
[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后面沒(méi)有參數(shù)時(shí),則對(duì)管道符丟給它的前一個(gè)命令的輸出結(jié)果進(jìn)行處理(即前一個(gè)命令的標(biāo)準(zhǔn)輸出作為本次命令的標(biāo)準(zhǔn)輸入)
[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]#
當(dāng)rm后面不指定刪除的文件時(shí),則會(huì)報(bào)錯(cuò)丟失參數(shù),所以,rm等命令不支持從標(biāo)準(zhǔn)輸入讀取參數(shù),只支持在命令行指定參數(shù),即指定刪除的文件。
標(biāo)準(zhǔn)輸入和命令行參數(shù)那個(gè)優(yōu)先?
有如下兩個(gè)文件
[root@linuxforliuhj test]# cat a.txt aaaa dddd cccc bbbb [root@linuxforliuhj test]# cat b.txt 1111 3333 4444 2222 [root@linuxforliuhj test]#
執(zhí)行命令:cat a.txt | sort
[root@linuxforliuhj test]# cat a.txt | sort aaaa bbbb cccc dddd [root@linuxforliuhj test]#
當(dāng)sort的命令行參數(shù)為空時(shí),默認(rèn)使用前一個(gè)命令的輸出結(jié)果作為本次命令的輸入
執(zhí)行命令:cat a.txt | sort b.txt
[root@linuxforliuhj test]# cat a.txt | sort b.txt 1111 2222 3333 4444 [root@linuxforliuhj test]#
可以看到,當(dāng)sort的命令行參數(shù)(此處為b.txt)不為空時(shí),sort不會(huì)讀取標(biāo)準(zhǔn)輸入里的參數(shù),而時(shí)讀取命令行參數(shù)
執(zhí)行命令:cat a.txt | sort b.txt -
[root@linuxforliuhj test]# cat a.txt | sort b.txt - 1111 2222 3333 4444 aaaa bbbb cccc dddd [root@linuxforliuhj test]#
" - "表示標(biāo)準(zhǔn)輸入,即命令cat a.txt 的輸出,相當(dāng)與對(duì)文件b.txt和標(biāo)準(zhǔn)輸入一起進(jìn)行排序,相當(dāng)于sort a.txt b.txt
[root@linuxforliuhj test]# sort a.txt b.txt 1111 2222 3333 4444 aaaa bbbb cccc dddd [root@linuxforliuhj test]#
思考:對(duì)于rm、kill等命令,我們寫(xiě)腳本時(shí)常常會(huì)遇到需要查詢某個(gè)進(jìn)程的進(jìn)程號(hào)然后殺掉該進(jìn)程,查找某個(gè)文件然后刪除它這樣的需求,該怎么辦呢?那就用xargs吧!
相關(guān)推薦:《Linux視頻教程》
以上就是linux中管道符是什么的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注其它相關(guān)文章!
版權(quán)聲明:
本站所有文章和圖片均來(lái)自用戶分享和網(wǎng)絡(luò)收集,文章和圖片版權(quán)歸原作者及原出處所有,僅供學(xué)習(xí)與參考,請(qǐng)勿用于商業(yè)用途,如果損害了您的權(quán)利,請(qǐng)聯(lián)系網(wǎng)站客服處理。