grep 的進階用法#

grep 是除錯時最常用的工具之一,善用其選項能大幅提高效率:

  • fgrep -lr 'Missing foo' .:遞迴搜尋所有包含特定錯誤訊息的檔案,不分程式語言都能用
  • -v (反向匹配):過濾掉不需要的雜訊,可串接多個 grep -v
  • --color:高亮顯示匹配文字,方便在長行中定位問題
# 找出包含 "Missing foo" 但排除 connection failure 和 test 的 log
fgrep 'Missing foo' *.log |
fgrep -v 'connection failure' |
fgrep -v test

如果系統不支援 grep -r,可以用 find . -type f | xargs fgrep -l 'Missing foo' 達成相同效果。

處理 Standard Error#

命令列程式依照慣例將錯誤訊息輸出到 standard error,不會混入 standard output。除錯時你可能需要分析這些錯誤訊息:

  • 2>filename:將 standard error 重導到檔案
  • 2>&1:將 standard error 合併到 standard output,以便用 pipeline 處理
# 將程式的 stdout 和 stderr 合併後用 more 瀏覽
program 2>&1 | more

用 tail -f 監控 Log 檔#

對於非互動式程式(如 web server),所有有價值的資訊都記錄在 log 檔中。tail -f 是即時監控 log 的最佳工具:

  • tail -f 會持續追蹤檔案成長,即時顯示新增內容
  • --follow=name:當 log 被 rotate(刪除後重建同名檔案)時,追蹤檔名而非 file descriptor
  • 可搭配 grep 篩選感興趣的訊息
# 即時監控郵件 log 中的連線速率問題
sudo tail /var/log/maillog | fgrep 'max connection rate'

背景執行與通知#

  • nohup& 讓長時間程式在背景執行,登出後仍繼續運行
  • printf '\a' 在命令完成時發出音效提醒
  • mail 將結果寄出
# 長時間測試完成後發出音效
long-running-regression-test ; printf '\a'

# 監控 log 出現特定訊息時發送郵件
sudo tail -f /var/log/secure |
fgrep -m 1 'Invalid user' |
mail -s Intrusion jdh@example.com

如果需要長期監控並在異常時通知,應該使用正式的監控基礎設施(見 Item 27),而非手工的 while read 迴圈。

重點回顧#

  • 善用 grep 的多種選項(-r-v-l--color)縮小搜尋範圍
  • 2>&12>filename 重導 standard error 以便分析
  • tail -f 即時監控不斷成長的 log 檔
  • 善用背景執行與通知機制,避免浪費等待時間