如何从Apache access日志文件中提取并输出状态码
Apache日志状态码提取方案
问题原因
用cut直接按空格切割出错的核心原因是:标准Apache访问日志的时间戳字段、请求行字段内部都包含空格,直接按空格切割的字段序号无法固定匹配到状态码位置。
方案1:用cut命令实现(适配cut操作场景)
利用反转行的方式避开前面字段的空格干扰,固定取倒数第二个字段(Apache标准日志中状态码固定为倒数第二个字段,最后一个字段为响应字节数),命令如下:
rev access.log | cut -d ' ' -f 2 | rev
操作逻辑:
- 先用
rev命令将整行内容字符反转,原本行尾的200 2326会变成6232 002 - 用cut按空格切割取第2个字段,得到反转后的状态码
002 - 再次用rev反转回来就得到正常的状态码
200
方案2:更稳妥的awk实现(兼容性更强,不受前面字段空格数量影响)
用awk的内置字段变量直接取倒数第二个字段,写法更简洁:
awk '{print $(NF-1)}' access.log
其中NF是awk的内置变量,代表当前行的总字段数,$(NF-1)就直接指向倒数第二个字段也就是状态码。
测试验证
对你给出的样例日志:
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
以上两种命令输出结果均为200,符合提取需求。
内容的提问来源于stack exchange,提问作者Ralin Tuscano
相关产品推荐
相关产品推荐

