如何编写Unix命令筛选日志中total值大于100的行?
解决日志中筛选total值大于100的JSON块问题
你的问题主要出在两个地方:一是原命令没有正确拆分日志里的单个JSON对象,二是错误指定了total数值的字段位置,同时阈值设置也不符合需求。下面给你两种可行的解决方法:
方法一:简洁版(依赖固定格式)
如果你的日志中每个{ ... }格式的JSON块结构很固定(键值对之间有空格,逗号跟在值后面),可以先用grep把每个JSON块单独提取成一行,再用awk判断数值:
grep -o '{[^}]*}' abcd.log | awk '$7 > 100'
解释:
grep -o '{[^}]*}':只输出每个匹配{开头、}结尾的内容,把每个JSON块拆成单独的行。awk '$7 > 100':在拆分后的每行中,total对应的数值是第7个字段(按空格分割),判断其是否大于100,满足条件就打印整行。
方法二:健壮版(适配格式变化)
如果日志格式可能有变动(比如键和值之间没有空格,或者字段顺序变化),用正则提取total数值的方式更可靠:
awk '{ # 循环匹配所有{...}格式的JSON块 while (match($0, /{[^}]+}/, block_arr)) { json_block = block_arr[0] # 提取total对应的数值,允许键和冒号、冒号和数值之间有任意空格 if (match(json_block, /"total"[[:space:]]*:[[:space:]]*([0-9]+)/, num_arr)) { total_value = num_arr[1] if (total_value > 100) { print json_block } } # 移除已处理的部分,继续处理剩余内容 $0 = substr($0, RSTART + RLENGTH) } }' abcd.log
这两种方法都能得到你想要的输出:
{ "_id" : "xyz", "total" : 180 }
内容的提问来源于stack exchange,提问作者SSK
相关产品推荐
相关产品推荐

