Linux 日志分析三剑客:`grep` + `awk` + `sed` 从入门到精通(附 Nginx/系统日志实战案例)

前言

在 Linux 系统中,日志是系统的“黑匣子”。无论是排查服务异常、分析用户行为,还是检测安全入侵,你都离不开对日志文件的高效处理。

每天面对成 GB 的日志,手动翻找无异于大海捞针。而掌握 grepawksed 这三大文本处理神器,你就能像“数据侦探”一样,几秒内从海量日志中精准提取关键信息

本文将带你从基础语法到高级技巧,结合 Nginx 访问日志、系统日志(syslog)、安全日志(auth.log) 等真实场景,彻底掌握这三位“日志分析三剑客”。


🧭 一、三剑客定位与分工

命令核心功能类比
grep查找符合条件的行“搜索引擎”
awk提取字段、统计、格式化输出“Excel 处理器”
sed流式编辑:替换、删除、插入“文本编辑器”

✅ 它们通常组合使用,形成强大的管道(pipe)处理链。


🔍 二、grep:精准查找日志条目

grep 是最常用的文本搜索工具,支持正则表达式。

✅ 基本用法

grep "error" /var/log/syslog

✅ 常用选项

选项说明
-i忽略大小写
-v反向匹配(排除)
-n显示行号
-r递归搜索目录
-E使用扩展正则(或 egrep
-A 3显示匹配行及后 3 行(上下文)
-B 2显示前 2 行

💡 实战案例

1. 查找所有错误日志(忽略大小写)

grep -i "error" /var/log/syslog

2. 排除无关信息(如健康检查)

grep "access.log" /var/log/nginx/access.log | grep -v "GET /health"

3. 查找 IP 地址(正则)

grep -E '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' access.log

4. 统计关键词出现次数

grep -c "Failed password" /var/log/auth.log

🪓 三、awk:字段提取与统计分析

awk 擅长按列(字段)处理文本,默认以空格或制表符分隔。

✅ 基本语法

awk '{print $1, $4}' filename
  • $0:整行
  • $1:第一列
  • $2:第二列

✅ 实战案例:Nginx 日志分析

Nginx 默认日志格式示例:

192.168.1.100 - - [05/Oct/2025:10:00:01 +0800] "GET /api/user HTTP/1.1" 200 1234 "https://example.com" "Mozilla/5.0"

1. 提取所有客户端 IP

awk '{print $1}' access.log

2. 统计访问量 Top 10 IP

awk '{ip[$1]++} END {for(i in ip) print ip[i], i}' access.log | sort -nr | head -10
  • ip[$1]++:以 IP 为键,统计次数
  • END{}:处理完所有行后执行
  • sort -nr:按数字逆序排序

3. 统计 HTTP 状态码分布

awk '{status[$9]++} END {for(s in status) print s, status[s]}' access.log
  • $9 是状态码(200, 404, 500 等)

4. 找出响应体大于 1MB 的请求

awk '$10 > 1048576 {print $1, $7, $10}' access.log
  • $10 是响应体大小(bytes)

5. 计算总流量(MB)

awk '{sum += $10} END {print "Total:", sum/1024/1024, "MB"}' access.log

✏️ 四、sed:流式文本编辑

sed 在不打开文件的情况下进行替换、删除等操作,适合批量处理。

✅ 基本语法

sed 's/原字符串/新字符串/g' filename
  • s:替换
  • g:全局(每行所有匹配项)

✅ 常用操作

1. 替换文本(如脱敏 IP)

echo "User from 192.168.1.100 logged in" | sed 's/192\.168\.1\.[0-9]\+/***.***.***.***/g'

输出:

User from ***.***.***.*** logged in

2. 删除包含某关键词的行

sed '/health/d' access.log

3. 在特定行后插入内容

sed '/Error:/a\  # Please check the service' error.log
  • a\:append(追加)

4. 直接修改文件(慎用!)

sed -i 's/http:/https:/g' config.txt
  • -i:in-place 修改文件
  • 可加备份:-i.bak

🚀 五、三剑客组合拳:实战高级案例

📌 案例 1:分析 Nginx 日志,找出访问 /admin 的异常 IP(返回 200 但来自非常见地区)

# 提取访问 /admin 且状态为 200 的 IP
awk '$7 ~ /\/admin/ && $9 == 200 {print $1}' access.log | \
sort | uniq -c | sort -nr | head -20

📌 案例 2:清理日志中的时间戳(只保留消息体)

# 去掉开头的时间部分
sed -E 's/^[^ ]+ [^ ]+ [^ ]+ \[.*\] "//' access.log | sed 's/"$//'

📌 案例 3:生成每日访问报告(IP 数、PV、UV)

#!/bin/bash
LOG="/var/log/nginx/access.log"

echo "=== Daily Report ==="
echo "Total PV: $(wc -l < $LOG)"
echo "Unique IPs (UV): $(awk '{print $1}' $LOG | sort -u | wc -l)"
echo "Top 5 IPs:"
awk '{ip[$1]++} END {for(i in ip) print ip[i], i}' $LOG | sort -nr | head -5

📌 案例 4:实时监控并告警 50x 错误

# 结合 tail -f 实时监控
tail -f /var/log/nginx/error.log | grep --line-buffered "50[0-9]" | \
while read line; do
    echo "⚠️ 50x Error: $line" | mail -s "Server Alert" admin@company.com
done

📊 六、正则表达式速查表(日志分析必备)

正则含义
.匹配任意字符
*前一个字符 0 次或多次
+前一个字符 1 次或多次
?前一个字符 0 次或 1 次
^行首
$行尾
[0-9]数字
[a-zA-Z]字母
\.转义点(匹配实际的 .)
\b单词边界

🎯 写在最后

grepawksed 是 Linux 文本处理的“三驾马车”。它们看似简单,但组合起来威力无穷。掌握它们,你不仅能:

  • 分钟级完成原本数小时的手工分析
  • 快速定位线上故障根源
  • 发现潜在的安全威胁
  • 自动化生成运维报告

更重要的是,这些技能是通往 Shell 脚本编程、自动化运维、DevOps 工程师 的必经之路。

记住:不要死记命令,而是理解“管道思维”——让数据像流水一样,被一个个工具依次处理。


如需获取更多关于 Linux 内核调优、企业级服务部署、自动化运维与安全加固 等深度实战内容,请持续关注本专栏 《Linux企业级运维实战》 系列文章。

📌 下期预告:《Linux 定时任务:crontab 从入门到高级调度策略实战》

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值