文章目录
前言
在 Linux 系统中,日志是系统的“黑匣子”。无论是排查服务异常、分析用户行为,还是检测安全入侵,你都离不开对日志文件的高效处理。
每天面对成 GB 的日志,手动翻找无异于大海捞针。而掌握 grep、awk、sed 这三大文本处理神器,你就能像“数据侦探”一样,几秒内从海量日志中精准提取关键信息。
本文将带你从基础语法到高级技巧,结合 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 | 单词边界 |
🎯 写在最后
grep、awk、sed 是 Linux 文本处理的“三驾马车”。它们看似简单,但组合起来威力无穷。掌握它们,你不仅能:
- 分钟级完成原本数小时的手工分析
- 快速定位线上故障根源
- 发现潜在的安全威胁
- 自动化生成运维报告
更重要的是,这些技能是通往 Shell 脚本编程、自动化运维、DevOps 工程师 的必经之路。
记住:不要死记命令,而是理解“管道思维”——让数据像流水一样,被一个个工具依次处理。
如需获取更多关于 Linux 内核调优、企业级服务部署、自动化运维与安全加固 等深度实战内容,请持续关注本专栏 《Linux企业级运维实战》 系列文章。
📌 下期预告:《Linux 定时任务:crontab 从入门到高级调度策略实战》
1053

被折叠的 条评论
为什么被折叠?



