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

如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:19:00