find 與 grep
兩個問題最常出現:「檔在哪個目錄?」以及「這行 log 在哪個檔?」。find 找檔名與屬性,grep 找檔案內容。
find:從目錄走下去
.是起點,可改成絕對路徑-name比對檔名(大小寫敏感;不管大小寫用-iname)-type f一般檔、-type d目錄-mtime -1一天內改過;+7是七天以前
找到之後直接對每個檔做事:
-exec 裡的 {} 代表目前這個檔,\; 結束這條 -exec。
先印出來再刪
不確定條件時,先只跑 find 看清單,確認無誤再加 -delete 或 rm。
grep:找文字
| 選項 | 作用 |
|---|---|
-n |
印行號 |
-i |
忽略大小寫 |
-R 或 -r |
遞迴目錄 |
-v |
反相,印出不含關鍵字的行 |
-E |
延伸正規表示式 |
-l |
只印檔名 |
管線裡的 grep nginx 有時會連 grep 自己那一行一起抓到。要比對程序名,更乾淨的做法是 pgrep nginx,或 grep '[n]ginx' 這種小技巧。
兩個合在一起
現代 GNU grep 的 -R --include 常常就夠用,不一定要先 find。檔非常多、條件很複雜(時間、大小、權限)時,才讓 find 當第一關。
相關的小工具
sort排序uniq去掉連續重複行(所以通常先 sort)cut依分隔符切欄位
這三個加上 grep,已經能應付大多數 log 統計。
總結
檔名與屬性用 find,檔案裡的字用 grep。輸出太多就再接 | less 或 | wc -l。接著可以看機器上正在跑什麼:程序管理。