You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:实现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

修改说明

  1. 表头格式化:用printf的占位符控制列宽,保证输出对齐美观
  2. 小时字段提取:
    • 优化版通过awk分割日志中的时间段([时间字符串]),拆分出小时部分
    • 循环版直接将循环变量作为小时值传递给awk,无需额外解析
  3. 效率提升:优化版仅对日志做2次grep扫描,避免原脚本中24次重复扫描日志的冗余操作
  4. 输出对齐:统一用printf格式化每行内容,确保三列布局整齐

预期输出样例

hrs   Counts  Response code
00    91      200
00    1       429
01    46      200
01    1       503
...

内容的提问来源于stack exchange,提问作者user3318024

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 02:21:01