從菜鳥到高手:用這幾個命令玩轉 Linux 日志分析
日志分析是系統管理員、開發人員和DevOps工程師日常工作中不可或缺的一部分。無論是排查系統故障、分析性能瓶頸,還是監控安全事件,日志都是最直接的信息來源。
本文是我為你整理的日志分析命令集,涵蓋Linux系統下各種日志文件的查看、過濾、統計和分析技巧,可以助你快速定位問題,提升工作效率。
一、基礎日志查看命令
1. tail命令 - 實時監控日志
tail命令是查看日志文件末尾內容的利器,特別適合實時監控日志變化:
# 查看文件最后10行(默認)
tail /var/log/syslog
# 查看文件最后100行
tail -n 100 /var/log/nginx/access.log
# 實時追蹤日志更新(最常用)
tail -f /var/log/apache2/error.log
# 同時追蹤多個日志文件
tail -f /var/log/nginx/access.log /var/log/nginx/error.log
# 顯示行號
tail -n 50 -v /var/log/auth.log
2. head命令 - 查看日志開頭
與tail相反,head用于查看文件開頭部分:
# 查看文件前20行
head -n 20 /var/log/dmesg
# 查看前100字節
head -c 100 /var/log/bootstrap.log
3. cat命令 - 完整日志查看
# 查看完整日志文件
cat /var/log/kern.log
# 結合more/less分頁查看
cat /var/log/long.log | more
cat /var/log/long.log | less
# 顯示行號
cat -n /var/log/syslog
# 顯示非空行
cat -s /var/log/nginx/error.log
4. grep命令 - 日志過濾神器
grep是日志分析中最強大的工具之一:
# 簡單搜索
grep "error" /var/log/syslog
# 忽略大小寫
grep -i "warning" /var/log/messages
# 顯示匹配行及前后5行
grep -A 5 -B 5 "critical" /var/log/application.log
# 反向匹配(顯示不包含error的行)
grep -v "error" /var/log/apache2/access.log
# 正則表達式匹配
grep -E "404|500" /var/log/nginx/access.log
# 統計匹配行數
grep -c "GET" /var/log/nginx/access.log
# 遞歸搜索目錄下所有日志文件
grep -r "segmentation fault" /var/log/
二、高級日志分析技巧
1. awk命令 - 字段提取與分析
awk特別適合處理結構化日志(如nginx、apache訪問日志):
# 提取訪問日志中的IP地址
awk '{print $1}' /var/log/nginx/access.log
# 統計IP訪問次數并排序
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
# 統計HTTP狀態碼出現次數
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
# 計算某時間段的請求數
awk '/12\/May\/2023:15:/,/12\/May\/2023:16:/' /var/log/nginx/access.log | wc -l
# 統計訪問量最大的URL
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
# 計算平均響應時間(假設第10列為響應時間)
awk '{sum+=$10; count++} END {print "Avg:",sum/count,"ms"}' /var/log/nginx/access.log
2. sed命令 - 流編輯器
sed適合對日志進行批量替換和過濾:
# 替換日志中的敏感信息
sed 's/192.168.1.100/[REDACTED]/g' /var/log/auth.log
# 提取特定時間范圍的日志
sed -n '/May 10 09:00:00/,/May 10 10:00:00/p' /var/log/syslog
# 刪除空白行
sed '/^$/d' /var/log/application.log
# 只顯示包含error或warning的行
sed -n '/error\|warning/p' /var/log/syslog
3. cut命令 - 按列提取
# 提取第一列
cut -d' ' -f1 /var/log/nginx/access.log
# 提取第5-8列
cut -d' ' -f5-8 /var/log/nginx/access.log
# 使用冒號分隔符提取用戶名
cut -d: -f1 /etc/passwd
三、日志統計與分析
1. 頻率統計
# 統計IP出現頻率
cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr
# 統計HTTP狀態碼頻率
cat /var/log/nginx/access.log | awk '{print $9}' | sort | uniq -c | sort -n
# 統計訪問最多的URL
cat /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head -20
# 統計不同HTTP方法的請求數
cat /var/log/nginx/access.log | awk '{print $6}' | sed 's/"http://g' | sort | uniq -c
2. 時間范圍分析
# 統計每小時請求數
cat /var/log/nginx/access.log | awk '{print $4}' | cut -d: -f2 | sort | uniq -c
# 統計每分鐘請求數(更精細)
cat /var/log/nginx/access.log | awk '{print $4}' | cut -d: -f2,3 | sort | uniq -c
# 統計每天請求數(需要日志中包含日期)
cat /var/log/nginx/access.log | awk '{print $4}' | cut -d[ -f2 | cut -d: -f1 | sort | uniq -c
3. 性能分析
# 找出響應時間最長的請求(假設第10列為響應時間)
cat /var/log/nginx/access.log | awk '{print $10,$7}' | sort -nr | head -20
# 統計不同響應時間的請求分布
cat /var/log/nginx/access.log | awk '{if($10<0.1) a++; else if($10<0.5) b++; else if($10<1) c++; else d++} END {print "0-0.1s:",a,"\n0.1-0.5s:",b,"\n0.5-1s:",c,"\n>1s:",d}'
# 計算95分位響應時間
cat /var/log/nginx/access.log | awk '{print $10}' | sort -n | awk '{all[NR] = $0} END{print all[int(NR*0.95)]}'
四、組合命令實戰
(1) 查找高頻率訪問的惡意IP
cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -20 | awk '{if($1>100) print $2}'
(2) 分析HTTP 500錯誤的請求
grep " 500 " /var/log/nginx/access.log | awk '{print $1,$7,$9}' | sort | uniq -c | sort -nr
(3) 實時監控錯誤日志并報警
tail -f /var/log/application.log | grep --line-buffered -E "ERROR|CRITICAL" | while read line; do echo "$line" | mail -s "Application Error Alert" admin@example.com; done
(4) 分析SSH暴力破解嘗試
cat /var/log/auth.log | grep "Failed password" | awk '{print $11}' | sort | uniq -c | sort -nr | head -20
cess.log.2023-$month-*.gz | wc -l; done
結語
掌握這些日志分析命令,您將能夠快速定位系統問題、分析性能瓶頸和識別安全威脅。建議將本文收藏作為參考手冊,在實際工作中靈活組合這些命令,逐步構建自己的日志分析手段。