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>&1或2>filename重導 standard error 以便分析 - 用
tail -f即時監控不斷成長的 log 檔 - 善用背景執行與通知機制,避免浪費等待時間