如何使用awk查找首个匹配行记录并在后续处理流程中调用
awk实现方案
核心思路
- 首次匹配到
time>11的行时,同时存储行号和行内容,且仅在第一次匹配时赋值,避免后续周期性出现的符合条件的行覆盖首次记录 - 全程处理所有行完成猫狗数量统计,无需中途退出
可直接运行的脚本如下:
awk ' BEGIN { totalcats = 0 totaldogs = 0 firstrecord = 0 firstcontent = "" } # 匹配时间行,仅首次满足time>11时存记录 /Time is now/ && ($4 + 0 > 11) && firstrecord == 0 { firstrecord = NR firstcontent = $0 } # 统计猫的数量 /cats/ { match($0, /([0-9]+) cats/) totalcats += substr($0, RSTART, RLENGTH - 5) + 0 } # 统计狗的数量 /dogs/ { match($0, /([0-9]+) dogs/) totaldogs += substr($0, RSTART, RLENGTH - 5) + 0 } END { printf "We found a total of %d cats and %d dogs in this log.\n", totalcats, totaldogs if (firstrecord > 0) { print "First occurrence was found on line: " firstrecord, firstcontent } else { print "No occurrence of time>11 found in log." } } ' time.log
关键说明
- 加了
firstrecord == 0的判断条件,保证只会保存第一次匹配到的符合条件的行,不会被后续周期性出现的时间行覆盖记录 - 猫狗统计使用正则匹配提取数字,兼容不同位置出现的猫狗记录,不需要依赖字段位置
- 末尾加了匹配结果判断,避免日志中没有符合条件的行时输出无效空内容
内容的提问来源于stack exchange,提问作者Paul H
相关产品推荐
相关产品推荐

