求助:实现Linux日志按小时统计响应码并添加小时列
按小时统计日志响应码次数的脚本修改方案
需求说明
需要在Linux环境下分析日志文件,按小时统计各类HTTP响应码的出现次数,输出需包含小时、计数、响应码三列格式(示例如下):
hrs Counts Response code
00 91 200
00 1 429
01 46 200
现有信息
示例日志行
IP web.com - [01/Aug/2023:01:27:21 +0200] "POST /aa/v1/bbb/session?device_id=urn:uuid:2972033-34a4-4d1c-8ctt-55d31140c09d HTTP/1.1" 503 0 "-" "IOS/2.1.0 (Linux; U; Android 8.1.0; ttw Build/OTT 1.171019.011)"
现有脚本
for i in {00..23} ; do grep "pattern" access.log |grep "03/Aug/2023:$i" |awk -F " " '{print $4,$9}' |awk '{print $NF}'|sort |uniq -c ; done
当前输出(缺少小时列)
91 200 1 429 46 200 1 503 11 200 4 200 7 200 9 200 37 200 1 403
修改后的脚本方案
高效优化版(减少重复扫描日志)
# 打印格式化表头 printf "%-5s %-7s %s\n" "hrs" "Counts" "Response code" # 单次扫描日志完成提取、统计、格式化 grep "pattern" access.log | grep "03/Aug/2023" | awk -F'[][]' '{split($2, time_arr, ":"); hour=time_arr[2]} {print hour, $9}' | sort | uniq -c | awk '{printf "%-5s %-7s %s\n", $2, $1, $3}'
原逻辑适配版(保留小时循环结构)
printf "%-5s %-7s %s\n" "hrs" "Counts" "Response code" for i in {00..23}; do grep "pattern" access.log | grep "03/Aug/2023:$i" | awk '{print $9}' | sort | uniq -c | awk -v curr_hour="$i" '{printf "%-5s %-7s %s\n", curr_hour, $1, $2}' done
修改说明
- 表头格式化:用
printf的占位符控制列宽,保证输出对齐美观 - 小时字段提取:
- 优化版通过
awk分割日志中的时间段([时间字符串]),拆分出小时部分 - 循环版直接将循环变量作为小时值传递给
awk,无需额外解析
- 优化版通过
- 效率提升:优化版仅对日志做2次
grep扫描,避免原脚本中24次重复扫描日志的冗余操作 - 输出对齐:统一用
printf格式化每行内容,确保三列布局整齐
预期输出样例
hrs Counts Response code 00 91 200 00 1 429 01 46 200 01 1 503 ...
内容的提问来源于stack exchange,提问作者user3318024
相关产品推荐
相关产品推荐

