從菜鳥到高手:用這幾個(gè)命令玩轉(zhuǎn) Linux 日志分析
日志分析是系統(tǒng)管理員、開發(fā)人員和DevOps工程師日常工作中不可或缺的一部分。無論是排查系統(tǒng)故障、分析性能瓶頸,還是監(jiān)控安全事件,日志都是最直接的信息來源。
本文是我為你整理的日志分析命令集,涵蓋Linux系統(tǒng)下各種日志文件的查看、過濾、統(tǒng)計(jì)和分析技巧,可以助你快速定位問題,提升工作效率。
一、基礎(chǔ)日志查看命令
1. tail命令 - 實(shí)時(shí)監(jiān)控日志
tail命令是查看日志文件末尾內(nèi)容的利器,特別適合實(shí)時(shí)監(jiān)控日志變化:
# 查看文件最后10行(默認(rèn))
tail /var/log/syslog
# 查看文件最后100行
tail -n 100 /var/log/nginx/access.log
# 實(shí)時(shí)追蹤日志更新(最常用)
tail -f /var/log/apache2/error.log
# 同時(shí)追蹤多個(gè)日志文件
tail -f /var/log/nginx/access.log /var/log/nginx/error.log
# 顯示行號(hào)
tail -n 50 -v /var/log/auth.log
2. head命令 - 查看日志開頭
與tail相反,head用于查看文件開頭部分:
# 查看文件前20行
head -n 20 /var/log/dmesg
# 查看前100字節(jié)
head -c 100 /var/log/bootstrap.log
3. cat命令 - 完整日志查看
# 查看完整日志文件
cat /var/log/kern.log
# 結(jié)合more/less分頁(yè)查看
cat /var/log/long.log | more
cat /var/log/long.log | less
# 顯示行號(hào)
cat -n /var/log/syslog
# 顯示非空行
cat -s /var/log/nginx/error.log
4. grep命令 - 日志過濾神器
grep是日志分析中最強(qiáng)大的工具之一:
# 簡(jiǎn)單搜索
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
# 正則表達(dá)式匹配
grep -E "404|500" /var/log/nginx/access.log
# 統(tǒng)計(jì)匹配行數(shù)
grep -c "GET" /var/log/nginx/access.log
# 遞歸搜索目錄下所有日志文件
grep -r "segmentation fault" /var/log/
二、高級(jí)日志分析技巧
1. awk命令 - 字段提取與分析
awk特別適合處理結(jié)構(gòu)化日志(如nginx、apache訪問日志):
# 提取訪問日志中的IP地址
awk '{print $1}' /var/log/nginx/access.log
# 統(tǒng)計(jì)IP訪問次數(shù)并排序
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
# 統(tǒng)計(jì)HTTP狀態(tài)碼出現(xiàn)次數(shù)
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
# 計(jì)算某時(shí)間段的請(qǐng)求數(shù)
awk '/12\/May\/2023:15:/,/12\/May\/2023:16:/' /var/log/nginx/access.log | wc -l
# 統(tǒng)計(jì)訪問量最大的URL
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
# 計(jì)算平均響應(yīng)時(shí)間(假設(shè)第10列為響應(yīng)時(shí)間)
awk '{sum+=$10; count++} END {print "Avg:",sum/count,"ms"}' /var/log/nginx/access.log
2. sed命令 - 流編輯器
sed適合對(duì)日志進(jìn)行批量替換和過濾:
# 替換日志中的敏感信息
sed 's/192.168.1.100/[REDACTED]/g' /var/log/auth.log
# 提取特定時(shí)間范圍的日志
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
# 使用冒號(hào)分隔符提取用戶名
cut -d: -f1 /etc/passwd
三、日志統(tǒng)計(jì)與分析
1. 頻率統(tǒng)計(jì)
# 統(tǒng)計(jì)IP出現(xiàn)頻率
cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr
# 統(tǒng)計(jì)HTTP狀態(tài)碼頻率
cat /var/log/nginx/access.log | awk '{print $9}' | sort | uniq -c | sort -n
# 統(tǒng)計(jì)訪問最多的URL
cat /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head -20
# 統(tǒng)計(jì)不同HTTP方法的請(qǐng)求數(shù)
cat /var/log/nginx/access.log | awk '{print $6}' | sed 's/"http://g' | sort | uniq -c
2. 時(shí)間范圍分析
# 統(tǒng)計(jì)每小時(shí)請(qǐng)求數(shù)
cat /var/log/nginx/access.log | awk '{print $4}' | cut -d: -f2 | sort | uniq -c
# 統(tǒng)計(jì)每分鐘請(qǐng)求數(shù)(更精細(xì))
cat /var/log/nginx/access.log | awk '{print $4}' | cut -d: -f2,3 | sort | uniq -c
# 統(tǒng)計(jì)每天請(qǐng)求數(shù)(需要日志中包含日期)
cat /var/log/nginx/access.log | awk '{print $4}' | cut -d[ -f2 | cut -d: -f1 | sort | uniq -c
3. 性能分析
# 找出響應(yīng)時(shí)間最長(zhǎng)的請(qǐng)求(假設(shè)第10列為響應(yīng)時(shí)間)
cat /var/log/nginx/access.log | awk '{print $10,$7}' | sort -nr | head -20
# 統(tǒng)計(jì)不同響應(yīng)時(shí)間的請(qǐng)求分布
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}'
# 計(jì)算95分位響應(yīng)時(shí)間
cat /var/log/nginx/access.log | awk '{print $10}' | sort -n | awk '{all[NR] = $0} END{print all[int(NR*0.95)]}'
四、組合命令實(shí)戰(zhàn)
(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錯(cuò)誤的請(qǐng)求
grep " 500 " /var/log/nginx/access.log | awk '{print $1,$7,$9}' | sort | uniq -c | sort -nr
(3) 實(shí)時(shí)監(jiān)控錯(cuò)誤日志并報(bào)警
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
結(jié)語
掌握這些日志分析命令,您將能夠快速定位系統(tǒng)問題、分析性能瓶頸和識(shí)別安全威脅。建議將本文收藏作為參考手冊(cè),在實(shí)際工作中靈活組合這些命令,逐步構(gòu)建自己的日志分析手段。