一、三剑客核心定位与分工命令核心功能类比grep按模式查找符合条件的行搜索引擎 / 超级探照灯awk按列提取字段、统计汇总、格式化输出Excel 数据处理器sed流式编辑替换、删除、插入、清洗文本编辑器三者协同完成日志分析的经典三步流程先用grep缩小搜索范围过滤再用awk提取关键字段并统计分析最后用sed清洗格式或脱敏敏感信息处理。二、grep精准查找日志条目2.1 基本语法bashgrep [选项] 模式 文件名grep是最常用的文本搜索工具支持正则表达式默认区分大小写。如果不指定文件名则从标准输入读取数据。2.2 常用选项选项说明-i忽略大小写-v反向匹配输出不匹配的行-n显示匹配行的行号-c统计匹配的行数-r/-R递归搜索目录-E使用扩展正则表达式等价于egrep-A n显示匹配行及其后 n 行After-B n显示匹配行及其前 n 行Before-C n显示匹配行及其前后各 n 行Context-w匹配整个单词避免部分匹配-o仅输出匹配到的部分而非整行2.3 grep 实战案例案例一查找错误日志忽略大小写bashgrep -i error /var/log/syslog忽略大小写可以同时捕获 error、Error、ERROR 等变体。案例二排除无关信息如健康检查bashgrep access.log /var/log/nginx/access.log | grep -v GET /health先用grep过滤出访问日志再用-v排除健康检查接口的请求。案例三查找 IP 地址正则匹配bashgrep -E \b([0-9]{1,3}\.){3}[0-9]{1,3}\b access.log使用扩展正则表达式-E匹配标准 IPv4 地址格式。案例四统计关键词出现次数bashgrep -c Failed password /var/log/auth.log-c直接返回匹配行数用于统计 SSH 暴力破解尝试次数。案例五查看错误上下文bashgrep -C 5 ERROR app.log显示匹配行前后各 5 行帮助理解错误发生的上下文环境。案例六实时监控错误日志bashtail -f /var/log/nginx/error.log | grep -i errortail -f持续输出新增日志结合grep实时过滤是运维中最常用的监控组合。三、awk字段提取与统计分析3.1 基本语法bashawk pattern { action } 文件名pattern匹配条件如/error/、$9 200可省略表示匹配所有行action对匹配行执行的操作如{print $1}可省略表示默认打印整行BEGIN{}在处理输入之前执行常用于初始化变量或打印表头END{}处理完所有行之后执行常用于汇总统计3.2 常用内置变量变量说明$0当前行的完整内容$1~$n当前行的第 1 至第 n 个字段NR当前已处理的记录数行号NF当前行的字段数量FS字段分隔符默认为空格或制表符OFS输出字段分隔符默认为空格FILENAME当前输入文件的名称3.3 改变字段分隔符bashawk -F, {print $1, $2} data.csv-F选项用于指定自定义字段分隔符如处理 CSV 文件时设为逗号。3.4 awk 实战案例以下案例基于 Nginx 默认访问日志格式以空格分隔text192.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 地址$4 时间戳带方括号$6 请求方法如 GET$7 请求路径如/api/user$9 HTTP 状态码200/404/500 等$10 响应字节数案例一提取所有客户端 IPbashawk {print $1} access.log提取第一列IP 地址快速列出所有访问来源。案例二统计访问量 Top 10 IPbashawk {ip[$1]} END {for(i in ip) print ip[i], i} access.log | sort -nr | head -10ip[$1]以 IP 为键构建关联数组统计每个 IP 的出现次数END{}所有行处理完毕后遍历数组并输出统计结果sort -nr按数字逆序排序head -10取前 10 条案例三统计 HTTP 状态码分布bashawk {status[$9]} END {for(s in status) print s, status[s]} access.log以 HTTP 状态码为键统计出现次数快速了解 200、404、500 等状态码的占比。案例四统计访问量最高的接口bashawk {print $7} access.log | sort | uniq -c | sort -nr提取请求路径$7去重排序后找出热门接口。案例五查找响应慢的接口耗时分析假设日志格式中包含响应耗时bashawk {print $7, $NF} access.log | sort -k2 -nr | head -10提取路径和最后一个字段耗时按数值降序排序后取前 10 条。案例六提取返回 500 错误的 URLbashawk $9 500 {print $7} access.log | sort -u仅处理状态码为 500 的行提取请求路径并去重。案例七统计各类移动端设备的访问量bash# 统计 iOS 设备访问量 awk $0 ~ /iPhone|iPad|iPod/ {count} END {print iOS:, count0} access.log # 统计 Android 移动端排除平板 awk $0 ~ /Android [0-9].*Mobile/ {count} END {print Android Mobile:, count0} access.log # 按主流移动浏览器细分 awk {if(/Chrome\/[0-9].*Mobile/) c; else if(/Safari\/[0-9].*Mobile/) s; else if(/MQQBrowser\//) q; else if(/MicroMessenger\//) w} END {print Chrome Mobile:,c; print Safari Mobile:,s; print QQ Browser:,q; print WeChat:,w} access.log$0 ~ /pattern/表示对整行内容进行正则匹配常用于 User-Agent 分类统计。四、sed流式文本编辑与清洗4.1 基本语法bashsed [选项] 命令 文件名-n抑制默认输出仅打印被显式指定的行-i直接修改文件原地编辑建议先备份-e执行多个命令4.2 核心操作替换s 命令bashs/原模式/替换内容/[标志]常用标志g全局替换默认仅替换每行第一个匹配p打印替换后的行常与-n配合i忽略大小写4.3 常用操作一览操作示例说明替换文本sed s/old/new/g file全局替换删除行sed /pattern/d file删除匹配的行删除空行sed /^$/d file删除空行打印指定行sed -n 5p file仅打印第 5 行打印范围sed -n 10,20p file打印 10~20 行插入行首sed s/^/prefix / file在每行开头添加内容追加行尾sed s/$/ suffix/ file在每行末尾添加内容4.4 sed 实战案例案例一批量替换文本bash# 将 sample.log 中的 WARN 替换为 WARNING仅输出不修改原文件 sed s/WARN/WARNING/g sample.log # 先备份再原地修改 cp sample.log sample.log.bak sed -i s/WARN/WARNING/g sample.log-i直接修改文件生产环境务必先备份。案例二删除调试日志bashsed /DEBUG/d app.log删除所有包含 DEBUG 的行快速过滤掉低优先级日志。案例三批量添加日期前缀bashsed -i s|^|$(date [%F %T] )| sample.log^锚定行首在每行开头插入当前日期时间戳。案例四日志清洗与格式标准化bash# 去掉方括号将 [error] 变成 error sed s/\[//g; s/\]//g log.txt # 多空格替换为逗号便于导入 CSV sed s/[[:space:]]\/,/g; s/^,//; s/,$// log.txt # IP 脱敏将 192.168.1.100 替换为 192.168.1.XXX sed s/192\.168\.1\.[0-9]\/192.168.1.XXX/g log.txt三个替换示例展示了 sed 在日志清洗中的典型应用。案例五按时间段截取日志bashsed -n /Oct 12 14:00:/, /Oct 12 15:00:/ p syslog/pattern1/,/pattern2/表示从匹配 pattern1 的行开始到匹配 pattern2 的行结束中间所有行都被选中。p打印这些行-n抑制其他输出。案例六修改配置文件参数bashsed -i /^max_connections/s/[0-9]\/1000/ my.cnf先通过/^max_connections/定位到以max_connections开头的行然后在该行内将数字替换为 1000。案例七提取 Nginx 日志中的 IP 和状态码bashsed -n s/^\([0-9.]\\).* [0-9]\ \([0-9]\\) .*/\1 \2/p access.log使用正则捕获组提取 IP 和状态码-n配合p仅打印匹配行。五、Nginx 日志分析综合实战5.1 Nginx 日志位置与格式访问日志/var/log/nginx/access.log错误日志/var/log/nginx/error.log默认访问日志格式combined示例text192.168.1.100 - - [05/Oct/2025:10:00:01 0800] GET /api/user HTTP/1.1 200 1234 https://example.com Mozilla/5.05.2 访问日志分析九式第一式统计总访问量bashwc -l /var/log/nginx/access.log第二式查找特定 IP 的访问记录bashgrep 123.45.67.89 /var/log/nginx/access.log第三式统计访问量 Top 10 IPbashawk {print $1} access.log | sort | uniq -c | sort -nr | head -10第四式统计 HTTP 状态码分布bashawk {print $9} access.log | sort | uniq -c | sort -nr第五式找出返回 404 最多的 URLbashawk $9 404 {print $7} access.log | sort | uniq -c | sort -nr | head -10第六式统计每小时请求量bashawk -F[][] {print $2} access.log | cut -d: -f2 | sort | uniq -c-F[][]设置方括号为分隔符提取时间字段cut -d: -f2截取小时部分。第七式找出被访问最多的静态资源bashawk {print $7} access.log | grep -E \.(jpg|png|css|js)$ | sort | uniq -c | sort -nr | head -10第八式统计 User-Agent 分布bashawk -F {print $6} access.log | sort | uniq -c | sort -nr | head -10第九式统计每小时平均响应大小bashawk -F[][] {hoursubstr($2,12,2); size[hour]$10; count[hour]} END {for(h in size) print h, size[h]/count[h]} access.log | sort5.3 错误日志分析要点定位所有错误bashgrep -i error /var/log/nginx/error.log统计各类错误频率bashgrep -i error error.log | awk {print $5,$6,$7,$8} | sort | uniq -c | sort -nr | head -20查看特定时间段错误bashgrep 2025/10/05 error.log | grep -i error六、系统日志分析实战6.1 系统日志类型与位置日志文件用途适用系统/var/log/syslog系统综合日志Debian/Ubuntu/var/log/messages系统综合日志CentOS/RHEL/var/log/auth.log认证与安全日志Debian/Ubuntu/var/log/secure认证与安全日志CentOS/RHEL6.2 安全日志分析检测 SSH 暴力破解bash# 统计失败登录尝试 grep Failed password /var/log/auth.log | wc -l # 找出尝试次数最多的 IP grep Failed password /var/log/auth.log | awk {print $(NF-3)} | sort | uniq -c | sort -nr | head -10 # 实时监控暴力破解 tail -f /var/log/auth.log | grep Failed password$(NF-3)表示倒数第 4 个字段在 auth.log 中通常是攻击者的 IP 地址。统计成功登录与失败登录bash# 成功登录 grep Accepted password /var/log/auth.log | awk {print $1,$2,$3,$9,$11} | sort | uniq -c # 失败登录按用户统计 grep Failed password /var/log/auth.log | awk {print $9} | sort | uniq -c | sort -nr检测 sudo 使用情况bashgrep sudo /var/log/auth.log | grep COMMAND6.3 内核与系统日志分析快速定位错误和警告bashgrep -i error\|warning\|fail\|denied /var/log/syslog | head -50查看最近一次系统启动日志bashgrep kernel /var/log/syslog | grep -E Linux version|Command line检测磁盘 I/O 错误bashgrep -i i/o error /var/log/syslog检测 OOM内存不足bashgrep -i out of memory /var/log/syslog6.4 按时间范围筛选日志bash# 按日期筛选 Nginx 访问日志 awk $4 ~ /\[.*$(date %d\/%b\/%Y)/ {print} /var/log/nginx/access.log # 按小时筛选 awk $4 ~ /^\[12\/Oct\/2025:14:/ {print} access.log$4是时间戳字段用正则匹配特定日期或小时。七、三剑客组合进阶技巧7.1 管道哲学Linux 的设计哲学是每个工具只做好一件事通过管道|将多个工具串联起来前一个命令的输出成为后一个命令的输入从而构建强大的处理流水线。bash原始日志 → grep过滤 → awk分析 → sed清洗 → 最终结果7.2 组合案例案例一提取 500 错误的客户端 IPbashgrep 500 access.log | awk {print $1} | sort | uniq -c | sort -nr案例二对错误日志脱敏后输出bashgrep -i error app.log | sed s/192\.168\.[0-9.]\/REDACTED_IP/g error_redacted.log案例三统计各状态码对应的请求数bashawk {print $9} access.log | sort | uniq -c | awk {print $2 : $1}案例四找出访问量 Top 3 的 URL 对应的来源 IPbashtop3_urls$(awk {print $7} access.log | sort | uniq -c | sort -nr | head -3 | awk {print $2}) for url in $top3_urls; do echo $url grep $url access.log | awk {print $1} | sort | uniq -c | sort -nr | head -5 done案例五统计每小时 5xx 错误数量bashawk -F[][] $9 ~ /^5[0-9][0-9]$/ {hoursubstr($2,12,2); err[hour]} END {for(h in err) print h, err[h]} access.log | sort八、正则表达式速查表元字符含义示例.匹配任意单个字符a.c匹配 abc、aac 等*匹配前一个字符 0 次或多次ab*匹配 a、ab、abb 等匹配前一个字符 1 次或多次ab匹配 ab、abb不匹配 a?匹配前一个字符 0 次或 1 次ab?匹配 a 或 ab^锚定行首^ERROR匹配以 ERROR 开头的行$锚定行尾done$匹配以 done 结尾的行[abc]匹配括号内任意一个字符[0-9]匹配任意数字[^abc]匹配不在括号内的字符[^0-9]匹配非数字字符|或运算error|warning匹配 error 或 warning\b单词边界\berror\b匹配独立单词 error( )分组捕获(ab)匹配 ab、abab 等九、性能优化与最佳实践9.1 大文件处理技巧优先用grep缩小范围减少管道传递的数据量使用-n抑制sed的默认输出减少 I/O 操作避免在循环中反复读取同一个大文件处理超大日志时可先用split分片或用tail/head取样测试命令效果9.2 常见错误与避坑问题正确做法忘记转义正则中的特殊字符如sed s/192\.168\./内网IP/g中的点需转义直接sed -i无备份先用cp file file.bak备份或使用sed -i.bakawk中混淆$1和$0$1是第一列$0是整行对二进制文件使用grep用grep -a强制按文本处理忘记设置字段分隔符非空格分隔文件需用awk -F或-F[][]等指定分隔符9.3 组合使用的最佳实践先过滤后分析用grep缩小数据范围再用awk处理避免重复读取一次性用awk完成多个统计任务而非多次读取同一文件善用BEGIN和END在awk中初始化变量和输出汇总结果先测试后生效使用sed替换前不加-i预览结果记录常用命令将高频组合写成脚本或别名提高效率十、总结grep、awk、sed是 Linux 日志分析中不可或缺的三个工具各有明确的分工grep以正则表达式为核心快速过滤定位目标行awk以字段处理为核心提取、统计、格式化输出sed以流式编辑为核心替换、删除、清洗日志内容