grep/sed/awk,Linux 文本处理三剑客,日志分析全靠它们。
grep:找
grep "error" /var/log/nginx/error.log
grep -r "password" /etc/ # 递归搜目录
grep -i "Error" app.log # 忽略大小写
grep -v "^#" config.conf # 反选:去掉注释行
grep -n "failed" auth.log # 显示行号
grep -c "404" access.log # 只计数
grep -E "404|500" access.log # 扩展正则,多模式
tail -f app.log | grep --line-buffered "ERROR" # 实时过滤
sed:改(流编辑)
sed 's/old/new/' file # 每行第一个 old 换 new
sed 's/old/new/g' file # 全换(g=global)
sed -i 's/old/new/g' file # -i 直接改文件(不加只预览)
sed -i.bak 's/a/b/g' file # 改前先备份 .bak
sed '10,20d' file # 删 10-20 行
sed -n '5p' file # 只打印第 5 行
实战:批量改 nginx 端口
sed -i 's/listen 80;/listen 8080;/g' /etc/nginx/sites-enabled/*
awk:算(按列处理)
awk '{print $1}' access.log # 打印第 1 列
awk '{print $1, $7, $9}' access.log # 打印 1、7、9 列
awk -F: '{print $1}' /etc/passwd # -F 指定分隔符为冒号
awk '$9==404 {print $7}' access.log # 第 9 列是 404,打印第 7 列(URL)
# 统计各状态码数量
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# 找访问量最高的 10 个 IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
实战:SSH 爆破日志分析
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -5
一行揪出爆破最凶的 5 个 IP。grep 找行,awk 取列,sort 排序,uniq 计数,head 取前几——管道串起三剑客。
实战:access.log 统计
# 总请求数
wc -l access.log
# 各 URL 访问量 Top10
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -10
# 404 最多的页面
awk '$9==404 {print $7}' access.log | sort | uniq -c | sort -rn | head -5
小结
下一篇 L13:定时任务与日志——cron 表达式详解,journalctl 查日志。