Linux日志分析需结合grep与awk:一、关键词匹配;二、正则提取IP与状态码;三、awk按列统计错误模块;四、时间范围筛选;五、多条件组合过滤。

如果您需要在Linux系统中快速从海量日志文件中提取关键信息,则可能面临行数庞大、格式不一、时间戳混杂等挑战。以下是结合grep与awk实现高效日志定位的多种实用方法:
一、按关键词精确匹配日志行
该方法利用grep的基础匹配能力,过滤出包含指定错误码、服务名或状态标识的日志条目,适用于初步缩小排查范围。
1、进入日志所在目录,例如:cd /var/log。
2、执行命令筛选含“Failed”字符串的行:grep "Failed" auth.log。
3、添加行号与颜色高亮以增强可读性:grep --color=always -n "Connection refused" syslog。
二、结合正则表达式提取IP地址与状态码
该方法使用grep的-E参数启用扩展正则,精准捕获日志中常见的IPv4地址和HTTP状态码组合,避免误匹配无关数字。
1、提取形如“192.168.1.100 - - [10/Jul/2024:14:22:03] "GET / HTTP/1.1" 500”的完整请求行:grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}.*" [45][0-9]{2}' access.log。
2、仅输出匹配的IP地址字段(非整行):grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' access.log | sort | uniq -c | sort -nr。
三、用awk按列截取并统计高频错误模块
该方法借助awk的字段分隔机制,将日志按空格或特定分隔符切分为列,从而定位第几列对应进程名、错误级别或模块标识,并进行频次统计。
1、假设syslog中第4列为服务名(如sshd、cron),统计各服务报错次数:awk '{print $4}' syslog | grep -v "^$" | sort | uniq -c | sort -nr。
2、提取包含“ERROR”且第5列时间戳为“Jul 10”的所有行,并只显示第1、4、6列:awk '$0 ~ /ERROR/ && $5 ~ /Jul[[:space:]]+10/ {print $1,$4,$6}' syslog。
四、时间范围筛选:awk解析日期字段定位故障时段
该方法通过awk将日志中的日期字符串转换为可比较的时间值(如mktime),实现对指定起止时间内的日志行精准抽取,适用于需复现某一时段行为的场景。
1、提取access.log中2024年7月10日14点至15点之间的所有记录(假设第4列为"[10/Jul/2024:14:XX:XX]"格式):awk -F'[][]' '$2 ~ /^10\/Jul\/2024:14:[0-5][0-9]:[0-5][0-9]/ {print}' access.log。
2、更严格地使用mktime转换并比对:awk '{if (match($4, /\\[([0-9]{2})\\/([A-Za-z]+)\\/([0-9]{4}):([0-9]{2}):([0-9]{2}):([0-9]{2})/)) {d = substr($4,RSTART+1,RLENGTH-2); cmd = "date -d \"" d "\" +%s 2>/dev/null"; cmd | getline ts; close(cmd); if (ts >= 1720620000 && ts 。
五、多条件联动:grep与awk嵌套实现复杂过滤
该方法将grep作为预筛选器减少输入量,再交由awk执行结构化处理,兼顾性能与灵活性,适合处理超大日志文件(如超过1GB)。
1、先用grep快速排除无关进程日志,再用awk提取响应时间大于500ms的Nginx慢请求:grep "upstream_response_time" nginx.log | awk -F'[ ;]+' '$12 > 0.5 {print $1,$4,$12}'。
2、查找包含“timeout”但不含“retry”的行,并打印前两列与倒数第二列:grep "timeout" app.log | grep -v "retry" | awk '{print $1,$2,$(NF-1)}'。










