50 個 Linux 日誌分析必備指令,懂一半你就是高手!

featured linux log
在 Linux 系統的運維、開發與故障排除工作中,日誌分析向來是核心環節。面對海量且分散的日誌文件,能否熟練運用命令列工具,直接決定了定位問題、排查異常、監控系統與安全審計的效率。本文將按「日誌收集→基礎查看→文本處理→統計彙總→即時監控」的實際操作流程,梳理 50 個必備 Linux 指令。掌握這些工具,你就能輕鬆應對各類日誌分析場景,高效解決問題。
一、日誌收集與定位
日誌分析的第一步,是快速找到目標日誌文件。以下指令能幫你精准定位所需日誌:
  1. find:最靈活的文件搜尋工具,支持按名稱、時間、大小等條件遞迴查詢,適用於未知日誌具體位置的場景。
示例:find /var/log -name “*.log” -mtime -1(查詢 /var/log 目錄下 24 小時內更新的 .log 文件)。
  1. locate/mlocate:依賴預建資料庫快速搜尋,速度比 find 快,適合已知部分文件名時定位。
注意:首次使用前需執行 updatedb 更新資料庫;示例:locate syslog(快速找到包含「syslog」的文件)。
  1. which:顯示指令的完整路徑,常用於確認分析工具(如 grepawk)是否安裝及安裝位置。
示例:which grep(查看 grep 指令的路徑)。
  1. whereis:比 which 更全面,可同時查詢指令的二進制文件、原始碼與手冊頁位置。
示例:whereis awk(獲取 awk 相關的所有文件路徑)。
二、基礎查看與導航
找到日誌文件後,需根據文件大小與查看需求,選擇合適的工具瀏覽內容:
  1. cat:直接列印文件全部內容,僅適用於小型日誌(幾百行以內)。
示例:cat /var/log/messages(查看系統消息日誌);警告:千萬不要用於幾萬行以上的大型文件,否則會卡頓!
  1. tac:反向列印文件內容,從最後一行開始輸出,適合快速查看日誌最新記錄。
示例:tac /var/log/syslog | head -n 20(查看系統日誌的最後 20 行)。
  1. head:顯示文件開頭部分,預設顯示前 10 行,可用於查看日誌的起始記錄(如服務啟動日誌)。
示例:head -n 100 /var/log/nginx/access.log(查看 Nginx 訪問日誌的前 100 行)。
  1. tail:顯示文件末尾部分,預設顯示最後 10 行,是查看最新日誌的常用工具。
示例:tail -n 50 /var/log/auth.log(查看認證日誌的最後 50 行)。
  1. less:功能最強大的分頁閱讀器,支持大型文件瀏覽(幾十萬行無壓力),還能搜尋(按 / 輸入關鍵字)、跳轉(按 G 到末尾,g 到開頭)、過濾內容(按 & 輸入過濾條件),是日誌查看的首選工具。
示例:less /var/log/kern.log(分頁查看內核日誌)。
  1. more:基礎分頁工具,功能比 less 簡單,僅支持按空格翻頁、Enter 換行,適用於簡單瀏覽場景。
示例:more /var/log/dpkg.log(查看軟件安裝日誌)。
  1. nl:列印文件時在每行前添加行號,方便定位特定內容(如上報問題時標注行號)。
示例:nl application.log | less(帶行號查看應用日誌)。
  1. file:判斷文件類型,避免誤打開壓縮文件或二進制文件(部分日誌如 lastlog 是二進制格式)。
示例:file /var/log/lastlog(確認 lastlog 的文件類型)。
三、核心文本處理與過濾
日誌分析的核心是「從海量內容中提取有效信息」,以下工具是實現這一需求的關鍵:
  1. grep:最常用的文本搜尋工具,支持正則運算式,可快速過濾包含指定內容的行,是日誌分析的「必備武器」。
  • 基礎用法:grep “ERROR” app.log(查詢應用日誌中包含「ERROR」的行);
  • 忽略大小寫:grep -i “warning” system.log(匹配「WARNING」「Warning」「warning」等);
  • 反向匹配:grep -v “INFO” debug.log(排除包含「INFO」的行,只保留錯誤 / 警告記錄);
  • 延伸正則:grep -E “Err(or)?|Fail”(匹配「Err」「Error」「Fail」等關鍵字);
  • 顯示前後內容:grep -A 3 -B 2 “Exception” trace.log(顯示包含「Exception」的行,以及前 2 行、後 3 行內容,便於查看異常上下文);
  • 遞迴搜尋:grep -r “connection refused” /var/log/(遞迴搜尋 /var/log 目錄下所有文件,查找包含「連接被拒絕」的記錄)。
  1. egrep:等同於 grep -E,直接支持延伸正則運算式,用法與 grep -E 一致,可簡化輸入。
示例:egrep “Success|Failed” auth.log(匹配認證日誌中的「Success」或「Failed」記錄)。
  1. fgrep/grep -F:固定字串搜尋,不解析正則元字元(如 . * 等),速度比普通 grep 快,適合搜尋包含特殊符號的內容(如 IP 地址、URL)。
示例:fgrep “192.168.1.100” access.log(精確匹配 IP 為 192.168.1.100 的訪問記錄)。
  1. awk:強大的文本處理工具,按「欄位」分析內容(預設以空格分隔欄位,$1 表示第一欄,$2 表示第二欄),支持統計、計算、格式化輸出,是處理結構化日誌(如 Nginx 訪問日誌、CSV 日誌)的「超級利器」。
  • 提取欄位:awk ‘{print $1, $4}’ access.log(列印訪問日誌的第一欄(IP)和第四欄(時間));
  • 自定義分隔符:awk -F’:’ ‘{print $1}’ /etc/passwd(以「:」為分隔符,提取用戶名);
  • 統計次數:awk ‘/ERROR/ {count++} END {print count}’ app.log(統計應用日誌中「ERROR」的出現次數);
  • 條件過濾:awk ‘$9 == 404 {print $7}’ access.log(查詢 HTTP 狀態碼為 404 的請求 URL)。
  1. sed:串流編輯器,可實現文本替換、刪除、插入等操作,常用於日誌內容清洗或格式轉換。
  • 內容替換:sed ‘s/foo/bar/g’ logfile(將日誌中所有「foo」替換為「bar」,g 表示全局替換);
  • 刪除行:sed ‘/DEBUG/d’ app.log(刪除包含「DEBUG」的行,只保留重要日誌);
  • 提取行:sed -n ‘10,20p’ system.log(僅列印第 10 到 20 行,-n 抑制預設輸出,p 表示列印);
  • 原地編輯:sed -i.bak ‘s/old/new/’ file(直接修改文件內容,並建立後綴為 .bak 的備份文件,避免誤操作丟失數據)。
  1. cut:按欄位或字元位置提取內容,用法比 awk 簡單,適合快速提取固定格式的欄位。
  • 按欄位提取:cut -d’ ‘ -f1,5 access.log(以空格為分隔符,提取第一欄和第五欄);
  • 按字元提取:cut -c1-10 timestamp.log(提取每行的第 1 到 10 個字元,適用於固定長度的時間戳)。
  1. paste:水平合併多個文件的內容,將多個文件的同一行拼接成一行,適合比對同時間段的不同日誌(如應用日誌與數據庫日誌)。
示例:paste app.log db.log(將 app.log 和 db.log 的內容按行合併)。
  1. join:基於共同欄位合併兩個已排序文件,類似數據庫的「聯表查詢」,適合按關鍵字(如用戶 ID、請求 ID)合併日誌。
示例:join -1 2 -2 3 log1.log log2.log(以 log1 的第二欄和 log2 的第三欄為共同欄位,合併兩個文件)。
  1. sort:對文本行進行排序,支持按字元、數值、欄位排序,常用於日誌去重或按規則整理內容。
  • 預設排序:sort access.log(按整行字元順序升序排序);
  • 數值排序:sort -n -k 3 data.log(按第三欄的數值大小排序,-n 表示數值模式,-k 3 表示第三欄);
  • 降序去重:sort -r -u error_codes.log-r 降序排序,-u 去除重複行)。
  1. uniq:檢測並處理重複行,但僅對「連續的重複行」有效,因此必須與 sort 搭配使用(先排序讓重複行集中,再去重)。
  • 統計次數:sort app.log | uniq -c(在每行前顯示重複次數,如統計重複的錯誤信息);
  • 僅顯示重複行:sort app.log | uniq -d(只保留出現超過一次的行);
  • 僅顯示唯一行:sort app.log | uniq -u(只保留出現一次的行)。
  1. tr:字元轉換或刪除工具,常用於日誌編碼處理或格式清洗。
  • 大小寫轉換:tr ‘[:lower:]’ ‘[:upper:]’ < logfile(將日誌全部轉為大寫);
  • 刪除特殊字元:tr -d ‘\r’ < windows.log > unix.log(刪除 Windows 格式日誌中的換行符 \r,轉換為 Unix 格式);
  • 壓縮空格:tr -s ‘ ‘ < logfile(將連續的空格壓縮為單個空格,整理混亂的欄位分隔)。
  1. wc:統計文件的行數、單詞數、位元組數,常用於快速了解日誌規模(如判斷是否有異常大量的日誌)。
  • 統計行數:wc -l access.log(查看訪問日誌的總行數,判斷流量規模);
  • 統計位元組:wc -c largefile.log(查看文件大小,避免磁碟空間不足);
  • 統計單詞:wc -w report.txt(統計文本中的單詞數,少用於日誌分析)。
  1. diff:比較兩個文件的差異,顯示不同行的內容,適合分析設定文件變更(如配置修改前後的對比)或不同時間段的日誌差異。
示例:diff config-old.conf config-new.conf(比較舊配置與新配置的區別)。
  1. comm:逐行比較兩個已排序文件,輸出三欄內容(左欄:僅 file1 有;中欄:僅 file2 有;右欄:兩者共有),可用於精確比對日誌差異。
示例:comm -12 file1 file2(隱藏左欄和中欄,僅顯示兩個文件共有的行)。
  1. column:將輸入內容格式化為整齊的表格,自動識別分隔符(如空格、Tab),常用於美化日誌輸出(如查看進程或磁碟信息時)。
示例:ps aux | column -t(將進程列表格式化為整齊的表格,便於閱讀)。
四、統計、彙總與格式轉換
面對結構化日誌(如 JSON、XML、CSV)或需要統計分析的場景,以下工具能大幅提升效率:
  1. awk(再次強調):不僅能提取欄位,還具備強大的統計與報表生成能力,是日誌統計的核心工具。
示例:awk ‘{ip[$1]++} END {for (i in ip) print ip[i], i}’ access.log | sort -nr(統計每個 IP 的訪問次數,並按次數降序排列)。
  1. sort | uniq -c(經典組合):最常用的統計組合,適用於各類「計數」場景(如統計錯誤類型、IP 訪問次數)。
示例:cut -d’ ‘ -f1 access.log | sort | uniq -c | sort -nr(提取訪問日誌的 IP 欄,統計訪問次數並降序排列)。
  1. jq:專門處理 JSON 格式的工具,現代應用(如 Docker、K8s、API 服務)的日誌多為 JSON 格式,jq 能實現解析、篩選、轉換等操作(需先安裝,如 apt install jqyum install jq)。
  • 提取欄位:cat log.json | jq ‘. | {timestamp: .ts, level: .lvl, message}’(從 JSON 日誌中提取時間戳、日誌等級、消息內容);
  • 條件篩選:jq ‘select(.level == “ERROR”)’ app.log(只保留等級為「ERROR」的 JSON 日誌);
  • 數值計算:jq ‘.response_time | max’ metrics.json(計算 JSON 日誌中「response_time」欄的最大值)。
  1. xmlstarlet:處理 XML 格式的工具包,支持 XML 文檔的查詢、編輯、轉換,適用於 XML 格式的日誌(需安裝,如 `apt install

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top