Shell(Bash)管道符用法詳解

2020-07-16 10:04:35
在 Bash 中,管道符使用"丨"代表。管道符也是用來連線多條命令的,如"命令1丨命令2"。不過和多命令順序執行不同的是,用管道符連線的命令,命令 1 的正確輸出作為命令 2 的操作物件。這裡需要注意,命令 1 必須有正確輸出,而命令 2 必須可以處理命令 1 的輸出結果;而且命令 2 只能處理命令 1 的正確輸出,而不能處理錯誤輸出。

舉個例子,我們經常需要使用"||"命令査看檔案的長格式,不過在有些目錄中檔案眾多,比如 /etc/ 目錄,使用"ll"命令顯示的內容就會非常多,只能看到最後的內容,而不能看到前面輸出的內容。

這時,我們馬上想到 more 命令可以分屏顯示檔案內容,可是怎麼讓 more 命令分屏顯示命令的輸出呢?我想到了一種笨辦法:

[[email protected] ~]# ll -a /etc/ > /root/testfile
#用輸出重定向,把ll命令的輸出儲存到/root/testfile 檔案中
[[email protected] ~]# more /root/testfile
#既然testfile是檔案,當然可以用more命令分屏顯示了
總用量1784
drwxr-xr-x. 105 root root 1228810月 21 12:49. dr-xr-xr-x. 26 root root 4096 6月519:06..
…省略部分輸出…
-rwxr-xr-x. 1 root root 687 6月 22 2012 auto.smb --More--(7%)


可是這樣操作實在不方便,這時就可以利用管道符了。命令如下:

[[email protected] ~]# ll -a /etc/|more

這條命令大家可以這樣理解:先把"ll -a /etc"命令 的輸出儲存到某個臨時檔案中,再用 more 命令處理這個檔案。也就是我們說的第一個命令的正確輸出是第二條命令處理和操作的物件。

注意,ll 命令操作的是檔名,所以匹配時使用的是萬用字元。但是一旦加入管道符,管道符之後的內容相當於操作的是檔案內容,所以匹配時使用的是正規表示式。

關於管道符,我們再舉幾個例子:

[[email protected] ~]# netstat -an | grep "ESTABLISHED"
#查詢一下本地所有網路連線,提取包含 ESTABLISHED(已建立連線)的行
#就可以知道我們的伺服器上有多少已經成功連線的網路連線
[[email protected] ~]# netstat -an | grep "ESTABLISHED" | wc-l
#如果想知道具體的網路連線數量,就可以再使用wc命令統計行數