管道符 (|) 是 Unix/Linux 系統中用於將一個命令的輸出傳遞給另一個命令作為輸入的符號

Yuezc發表於2024-11-13

一、管道符

管道符(|) 是 Unix/Linux 系統中用於將一個命令的輸出傳遞給另一個命令作為輸入的符號。它是命令列和 shell 指令碼中非常常用的工具,允許你將多個命令連結在一起,形成資料處理管道。

1、管道符的用法

最基本的用法是將一個命令的輸出傳遞給另一個命令。例如,以下命令將 ls -l 的輸出傳遞給 grep,以查詢包含 "txt" 的行:

ls -l | grep "txt"

在這個例子中,ls -l 列出當前目錄的詳細資訊,然後 grep 從中篩選出包含 "txt" 的行。
2、組合多個管道
管道符可以串聯多個命令,形成更復雜的資料處理流程。例如,以下命令組合了 ps, grep, 和 awk,來查詢執行的程序並提取特定的列:

ps aux | grep "bash" | awk '{print $1, $2}'

這裡,ps aux 列出所有程序,grep "bash" 篩選出與 "bash" 相關的程序,然後 awk 提取程序所有者和程序 ID。
3、使用管道符進行統計和分析
管道符可以用於統計資料,例如統計當前目錄中包含特定字元的檔案數量:

ls | grep "log" | wc -l

這個命令統計當前目錄中包含 "log" 的檔案數量,wc -l 用於計算行數。

4、管道符和重定向
管道符通常與重定向結合使用,以將輸出傳送到檔案或其他地方。例如,將 ls -l 的輸出透過管道傳遞給 tee,同時顯示輸出並儲存到檔案:

ls -l | tee output.txt

這個命令顯示 ls -l 的輸出,並將其儲存到 output.txt。

注意事項
錯誤處理:管道符只能傳遞標準輸出,而不能傳遞標準錯誤。要處理標準錯誤,可能需要 2>&1 或類似重定向。
不改變原始資料:管道符不會改變原始資料,它只是將資料從一個命令傳遞到另一個命令。
效能:長管道鏈可能會影響效能,儘量使用精簡的命令鏈。
二、擴充套件命令
1、sort
sort用於對輸入資料進行排序

-n:按數值順序排序。例如,對數字列表進行排序。
-r:反轉排序順序,得到降序結果。
-u:只保留唯一的行,移除重複行。
-k:指定按哪個欄位排序。
-t:指定欄位分隔符
例:

[root@localhost ~]# sort -t":" -k3 -n /etc/passwd #以: 分隔,將第三列按字數升序
[root@localhost ~]# sort -t":" -k3 -n /etc/passwd -r #以: 分隔,將第三列按字數降序
[root@localhost ~]# sort -t":" -k3 -n /etc/passwd |head #以: 分隔,將第三列按字數升序看前十行
[root@localhost ~]# sort -t":" -k3 -n /etc/passwd |tail #以: 分隔,將第三列按字數升序看後十行
=========================================================================

2、xargs
用於將標準輸入轉換為命令列引數。它在處理複雜的命令列輸入、將輸出傳遞給另一個命令或執行批處理操作時用。管道對:ls cp rm 不能執行。所以透過xargs。

-I {}:指定佔位符,將輸入的每一行替換為 {},然後執行命令。
-i :為了讓大括號生效
-r : 目錄時需要加-r
-n N:指定每次使用多少個引數執行命令。
-t:在執行命令之前列印出命令的內容("trace" 方式)。
-d <delimiter>:指定輸入的分隔符。
-p:互動式確認,在執行每個命令之前提示確認。
#批次刪除檔案

# 刪除當前目錄中以 ".tmp" 結尾的所有檔案

ls *.tmp | xargs rm

#在這個例子中,xargs 將 ls 的輸出轉換為 rm 的引數,實現批次刪除。

#按行處理檔案 # 將多個檔案按行拼接輸出

echo -e "file1.txt\nfile2.txt" | xargs cat

#這裡,xargs 將兩個檔名作為 cat 命令的引數,並將它們的內容拼接輸出。

#使用佔位符 # 將檔名作為引數傳遞,進行操作

echo -e "file1.txt\nfile2.txt" | xargs -I {} mv {} /backup/

#使用 -I {} 指定 {} 為佔位符,允許在命令中替換為輸入的每一行。

#限制引數數量 # 每次使用兩個引數執行命令

echo -e "file1.txt\nfile2.txt\nfile3.txt\nfile4.txt" | xargs -n 2

#使用 -n 2 限制每次傳遞給命令的引數數量。在這個例子中,每次 xargs 只使用兩個檔名。

#使用自定義分隔符 # 使用 ":" 作為分隔符,處理不同的輸入

echo "word1:word2:word3" | xargs -d ':' echo

#透過 -d ':' 指定 : 為分隔符,允許拆分輸入並作為引數傳遞給命令。

#互動式確認 # 在刪除檔案之前,要求確認

ls *.tmp | xargs -p rm

#使用 -p 在執行每個命令之前進行互動式確認,增加安全性。

#將輸出傳遞給另一個命令 # 將 ps 的輸出傳遞給 grep,然後傳遞給 xargs

ps aux | grep "bash" | awk '{print $2}' | xargs kill

#在這個例子中,xargs 接收 awk 的輸出並傳遞給 kill,實現批次殺死程序。

#生成備份 # 備份多個檔案

ls *.txt | xargs -I {} cp {} {}.bak

#使用 xargs -I {} 生成備份檔案,將每個檔案複製並新增 .bak 字尾。

#使用 echo 檢視命令 # 檢視即將執行的命令,用於除錯

echo -e "file1.txt\nfile2.txt" | xargs -t cat

#使用 -t 來顯示 xargs 即將執行的命令,用於除錯和追蹤。

3、tee
tee 是“T”形管道的一種比喻,因為它將資料分流到兩個方向。

-a:追加模式。預設情況下,tee 會覆蓋目標檔案,使用 -a 可以將輸出追加到檔案末尾。
-i:忽略中斷訊號(SIGINT)。在某些情況下,可能需要防止中斷訊號干擾 tee 的執行。
#將輸出儲存到多個檔案
# 將輸入同時輸出到標準輸出和多個檔案

echo "Hello, Multi!" | tee output1.txt output2.txt

#tee 可以同時輸出到多個檔案,傳遞給命令的所有檔名都會得到輸出。

#追加到檔案
# 追加模式,不覆蓋原有內容

echo "Another line" | tee -a output.txt

#在這個例子中,tee -a 追加到 output.txt,不會覆蓋原有內容。

#與其他命令結合使用
# 將 ls 輸出既輸出到標準輸出,又儲存到檔案

ls | tee output.txt

#tee 常與其他命令結合,透過管道符 | 傳遞資料。

#忽略中斷訊號
# 忽略中斷訊號,防止意外終止

echo "Some content" | tee -i output.txt

#-i 引數用於忽略中斷訊號,確保 tee 不會因為訊號而中斷。
應用場景

日誌記錄:同時檢視命令的輸出並儲存到檔案。
除錯和測試:在執行過程中將輸出儲存,以便後續分析。
檔案備份:同時寫入多個檔案,用於備份和冗餘。
————————————————————————————

原文連結:https://blog.csdn.net/Lzcsfg/article/details/138307665

相關文章