跳至主要内容

尋找檔案與字串過濾 (Log 探勘神技)

當伺服器發生資安滲透、日誌異常爆發或效能卡頓時,Linux 三劍客與現代工具 findgrepawk 是你在數萬筆系統紀錄裡進行資料探勘 (Data Mining) 的瑞士軍刀。


1. find:根據屬性、大小與時間搜尋主機檔案

# 1. 依檔案名稱過濾 (-name 可以支援通配符)
$ sudo find /var/log/ -name "*.log"

# 2. 🌟 依檔案大小過濾 (尋找大於 100MB 且修改時間在 7 天內的檔案)
$ sudo find /var/ -type f -size +100M -mtime -7

# 3. 🌟 搭配執行指令 (-exec):找到 30 天以前的舊日誌並自動清除
$ sudo find /var/log/app -name "*.log" -type f -mtime +30 -delete

2. grep / ripgrep (rg):高速正規表示法字串比對

# 1. 忽略大小寫 (-i),並列出匹配所在的檔案名稱與行號 (-rn)
$ grep -rni "error" /var/log/nginx/

# 2. 🌟 反向排除 (-v):列出 Nginx access.log 中所有不包含 " 200 " (非成功請求) 的列
$ grep -v " 200 " /var/log/nginx/access.log

# 3. 查閱錯誤訊息的「前後線索」(-C 3 表示同時印出匹配行的 上 3 行 與 下 3 行 上下文)
$ grep -C 3 "NullPointerException" /opt/app/error.log

3. 日誌探勘與維運三大高階實戰情境範例

情境一:主機出現 No space left on device,如何在 5 秒內找出一夕之間灌滿硬碟的兇手?

  • 實戰指令
    # 從系統根目錄尋找超過 500MB 的檔案,並把它們交給 ls -lh 依序列出完整容量資訊
    $ sudo find / -type f -size +500M -exec ls -lh {} + 2>/dev/null | awk '{print $5, $9}'

情境二:網站遭 DDoS 或暴力測試,如何用 grep + awk 瞬間統計出「發送 502/404 最多的 前 10 個 IP 排行榜」?

  • 實戰指令 (Web Access Log 分析精華)
    # 步驟拆解:抓取 502 報錯 -> 印出第 1 欄(IP) -> 排序 -> 統計重複次數 -> 依照數值反向排列 -> 取前 10 名
    $ grep " 502 " /var/log/nginx/access.log \
    | awk '{print $1}' \
    | sort \
    | uniq -c \
    | sort -nr \
    | head -n 10

情境三:想在專案數千隻原始碼檔案中,快速找出「哪隻程式碼偷偷硬編碼 (Hardcode) 了資料庫連線密碼」?

  • 實戰指令
    # -R 遞迴搜尋, -i 忽略大小寫, -l 只顯示檔名不印出內容, --exclude-dir 排除不要查的資料夾
    $ grep -Ril --exclude-dir={node_modules,.git,vendor} "password *=" /opt/my-project/