如何根据日志前一行匹配模式统计对应HTTP状态码的行数
用awk实现成对日志的状态码统计
没问题,这个需求用awk来处理最合适不过了——它天生擅长处理这种跨行关联的文本逻辑。这里给你一个直接可用的命令,完美匹配你的需求:
NR%2==1 { if ($0 ~ /UA-1234567-3|UA-1234567-4/) { flag=1; next } else { flag=0 } } NR%2==0 && flag==1 { code=$1; count[code]++ } END { for (c in count) print c ": " count[c] }
命令逻辑解释
- 第一行:处理奇数行(也就是请求行)。如果当前行包含
UA-1234567-3或UA-1234567-4,就设置标记flag=1并跳过下一行处理;否则标记flag=0,忽略对应的响应行。 - 第二行:处理偶数行(响应行),只有当之前的请求行匹配目标UA(
flag=1)时,才提取响应行的第一个字段(也就是HTTP状态码),并在count数组中累加计数。 - 第三行:所有日志处理完成后,遍历
count数组,输出每个状态码及其出现次数。
简化优化版
如果你的目标UA是连续的编号(比如3和4),可以用正则表达式简化匹配规则,让命令更简洁:
NR%2==1 { flag=($0 ~ /UA-1234567-[34]/) ? 1 : 0; next } NR%2==0 && flag { count[$1]++ } END { for (c in count) print c ": " count[c] }
注意事项
- 假设你的HTTP状态码是响应行的第一个字段,如果实际日志中状态码位置不同(比如第二个字段),只需要把
$1改成对应位置的$n即可。 - 如果需要区分不同UA对应的状态码,可以修改逻辑,比如用
count[ua, code]这样的多维数组来统计,不过你的需求里是合并统计两个UA的结果,所以当前命令足够。
举个例子,假设你的日志内容如下:
GET /api/v1/user UA-1234567-3
200 OK
POST /api/v1/login UA-1234567-5
400 Bad Request
GET /api/v1/data UA-1234567-4
500 Internal Server Error
GET /api/v1/info UA-1234567-3
200 OK
运行命令后会输出:
200: 2 500: 1
内容的提问来源于stack exchange,提问作者Dmitry S. Karasev
相关产品推荐
相关产品推荐

