溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

linux管道符的作用是什么

發(fā)布時間:2023-04-19 10:49:43 來源:億速云 閱讀:103 作者:iii 欄目:建站服務(wù)器

本文小編為大家詳細(xì)介紹“l(fā)inux管道符的作用是什么”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“l(fā)inux管道符的作用是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

在linux中,管道符“|”的作用是連接多條指令,前一條指令的輸出流會作為后一條指令的操作對象,其命令格式為“指令1 | 指令2 | …”,該命令的后一條指令,必須能夠接收標(biāo)準(zhǔn)輸入流命令才能執(zhí)行。管道符主要用于多重命令處理,前面命令的打印結(jié)果作為后面命令的輸入。

管道是Linux中很重要的一種通信方式,是把一個程序的輸出直接連接到另一個程序的輸入。常說的管道多是指無名管道,無名管道只能用于具有親緣關(guān)系的進(jìn)程之間,這是它與有名管道的最大區(qū)別。

有名管道叫named pipe或者FIFO(先進(jìn)先出),可以用函數(shù)mkfifo()創(chuàng)建。

linux中的|管道符

| 管道符的作用是連接多條指令,前一條指令的輸出流會作為后一條指令的操作對象,其命令格式為“指令1 | 指令2 | …”,該命令的后一條指令,必須能夠接收標(biāo)準(zhǔn)輸入流命令才能執(zhí)行。

管道命令的操作符是:”|”,它只能處理由前面一條指令傳出的正確輸出信息,對錯誤信息是沒有直接處理能力的。然后,傳遞給下一條指令,作為操作對象。

語法:

指令1 | 指令2 | …

管道符主要用于多重命令處理,前面命令的打印結(jié)果作為后面命令的輸入。簡單點說就是,就像工廠的流水線一樣,進(jìn)行完一道工序后,繼續(xù)傳送給下一道工序處理…

舉個栗子:對hello.sh文件進(jìn)行排序去重以后找出包含"better"的行

命令為:cat hello.sh | sort | uniq | grep 'better’

  • 查看文本

  • 排序

  • 去重

  • 過濾

linux管道符的作用是什么

【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é)果通過管道丟給sort命令,所以sort命令是對前面cat命令輸出的文本進(jìn)行排序

[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結(jié)合使用才能有效去重,所以通過管道將sort處理后輸出的文本丟給uniq處理,所以uniq處理的是排序好的文本,可以進(jìn)行有效去重

[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命令處理后輸出的文本進(jìn)行過濾

[root@linuxforliuhj test]# cat hello.sh | sort | uniq | grep 'better'be better[root@linuxforliuhj test]#

重點來了!

重點來了!

重點來了!

以上的cat、sort、uniq、grep等命令均支持管道符,是因為這些命令均可從標(biāo)準(zhǔn)輸入中讀取要處理的文本(即從標(biāo)準(zhǔn)輸入中讀取參數(shù));而對于部分命令,例如rm、kill等命令則不支持從標(biāo)準(zhǔn)輸入中讀取參數(shù),只支持從命令行中讀取參數(shù)(即rm命令后面必須指定刪除的文件或者目錄,kill命令后面必須要指定殺死的進(jìn)程號等)

那什么樣的命令支持管道,什么樣的命令不支持管道呢?
一般情況下,處理文本的命令,例如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后面沒有參數(shù)時,則對管道符丟給它的前一個命令的輸出結(jié)果進(jìn)行處理(即前一個命令的標(biāo)準(zhǔn)輸出作為本次命令的標(biāo)準(zhǔn)輸入)

[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]#

當(dāng)rm后面不指定刪除的文件時,則會報錯丟失參數(shù),所以,rm等命令不支持從標(biāo)準(zhǔn)輸入讀取參數(shù),只支持在命令行指定參數(shù),即指定刪除的文件。

標(biāo)準(zhǔn)輸入和命令行參數(shù)那個優(yōu)先?

有如下兩個文件

[root@linuxforliuhj test]# cat a.txt aaaa
dddd
cccc
bbbb[root@linuxforliuhj test]# cat b.txt 1111333344442222[root@linuxforliuhj test]#

執(zhí)行命令:cat a.txt | sort

[root@linuxforliuhj test]# cat a.txt | sortaaaa
bbbb
cccc
dddd[root@linuxforliuhj test]#

當(dāng)sort的命令行參數(shù)為空時,默認(rèn)使用前一個命令的輸出結(jié)果作為本次命令的輸入

執(zhí)行命令:cat a.txt | sort b.txt

[root@linuxforliuhj test]# cat a.txt | sort b.txt 1111222233334444[root@linuxforliuhj test]#

可以看到,當(dāng)sort的命令行參數(shù)(此處為b.txt)不為空時,sort不會讀取標(biāo)準(zhǔn)輸入里的參數(shù),而時讀取命令行參數(shù)

執(zhí)行命令:cat a.txt | sort b.txt -

[root@linuxforliuhj test]# cat a.txt | sort b.txt -1111222233334444aaaa
bbbb
cccc
dddd[root@linuxforliuhj test]#

" - "表示標(biāo)準(zhǔn)輸入,即命令cat a.txt 的輸出,相當(dāng)與對文件b.txt和標(biāo)準(zhǔn)輸入一起進(jìn)行排序,相當(dāng)于sort a.txt b.txt

[root@linuxforliuhj test]# sort a.txt b.txt1111222233334444aaaa
bbbb
cccc
dddd[root@linuxforliuhj test]#

讀到這里,這篇“l(fā)inux管道符的作用是什么”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI