熟悉 ls、cd、grep 是入門,掌握以下 10 個「知名度不高但解決特定問題極其高效」的命令,能讓你在終端機操作上更上一層樓。
pgrep / pkill — 進程名稱精準查殺替代 ps aux | grep xxx | awk '{print $2}' 的繁瑣管線。
pgrep -u root nginx # 列出 root 執行的 nginx PID
pkill -f "python.*script.py" # 依完整命令列模式殺進程
pgrep -a ssh # 顯示 PID 與完整命令列
pstree — 視覺化進程樹一眼看清父子進程關係,排查 Fork 炸彈或服務啟動關係神器。
pstree -p -a # 顯示 PID 與完整參數
pstree -u # 顯示用戶切換
bc / dc — 終端機內的精密計算器支援任意精度算術、進制轉換、函數定義。bc 為中綴語法 (類 C),dc 為後綴 (RPN)。
echo "scale=10; sqrt(2)" | bc # 開根號,10 位小數
echo "ibase=16; obase=2; FF" | bc # 16 進位轉 2 進位
# 互動模式下可定義函數、迴圈
split / csplit — 大檔案分割神器將巨大日誌/備份檔切分為小塊,便於傳輸、並行處理或上傳限制大小的存儲。
split -b 100M -d large.log chunk_ # 按 100MB 分割,數字後綴
split -l 10000 -d large.log chunk_ # 按 10000 行分割
csplit -f sec_ log.txt '/^SECTION/' '{*}' # 依正則分割 (如按章節)
nl — 給輸出加行號閱讀程式碼、腳本、編譯錯誤輸出時,行號是定位關鍵。
nl -ba script.sh # 為所有行編號 (含空行)
cat -n script.sh # 替代方案
nl -ba script.sh | sed -n '50,100p' # 結合篩選行範圍
mkfifo — 建立命名管道 (FIFO) 實現進程通訊無需臨時檔案,實現 Shell 管線的「非線性」連接,適合多進程協作。
mkfifo mypipe
# 終端 1: 生產者
ls -R / > mypipe
# 終端 2: 消費者
grep "\.conf$" < mypipe
# 甚至可跨網路: ssh user@host "cat > mypipe" < local_file
ldd — 動態連結庫依賴檢視排查「找不到共享庫」、「版本衝突」、「二進制無法執行」的首選工具。
ldd /usr/bin/nginx
# 輸出: linux-vdso.so.1 => ... /lib/x86_64-linux-gnu/libpcre.so.3 => ...
ldd -v /path/to/binary # 詳細版本資訊
LD_DEBUG=libs ./binary # 極度詳細的動態鏈接器除錯輸出
col — 過濾控制字元,淨化 Man Page 輸出將含反白/底線控制碼的 man 頁轉為純文字,便於存檔、搜尋、列印。
man bash | col -b > bash_manual.txt # -b 移除退格鍵字元
man ls | col -bx | grep -A5 -B5 "SORT"
xmlwf — XML 井格性 (Well-formedness) 驗證快速檢查 XML 結構是否合法 (標籤閉合、巢狀正確),無需完整 Schema 驗證。
xmlwf config.xml # 正常無輸出,錯誤顯示行號與描述
curl -s https://api.example.com/data.xml | xmlwf -
lsof — 列出進程開啟的檔案 (一切皆檔案)系統偵查瑞士刀:找佔用埠口、追蹤檔案鎖、發現被刪除但佔用空間的檔案。
lsof -i :80 # 佔用 80 埠的進程
lsof -p # 某進程開啟的所有檔案
lsof +L1 # 列出連結數為 0 (已刪除但未釋放) 的檔案
lsof -u www-data # 特定用戶開啟的檔案
這些命令各自解決一類「用常規工具很麻煩、寫腳本太重」的痛點。將它們納入工具箱,下次遇到對應場景時,你會發現一條命令搞定原本需要十行腳本的工作。