使用jq处理journalctl的JSON输出,实现指定游标区间的日志匹配统计
实现方案
统计两个游标之间匹配字符串的日志数量
直接用jq内置的reduce和break逻辑实现读到指定游标即终止,无需额外管道命令,执行效率更高,命令如下:
# 提前定义你的游标和搜索字符串 FIRST_CURSOR="你的起始游标值" LAST_CURSOR="你的终止游标值" SEARCH_STR="My search string" journalctl -u my-service --after-cursor="$FIRST_CURSOR" -o json | \ jq -n --arg last_cursor "$LAST_CURSOR" --arg search_str "$SEARCH_STR" ' def count_matches: reduce inputs as $entry (0; if $entry.__CURSOR == $last_cursor then break . else if $entry.MESSAGE | test($search_str) then . + 1 else . end end ); count_matches '
逻辑说明
- 通过
--arg参数将shell变量传入jq内部,避免特殊字符转义问题 - 用
reduce遍历所有输入的日志JSON对象,初始匹配计数为0 - 每读取一条日志先校验游标,命中终止游标则调用
break .直接终止处理,无需继续读取后续日志 - 未命中终止游标则判断日志内容是否匹配搜索字符串,匹配则计数+1
- 最终直接输出计数结果,无需额外调用
wc -l,去除原写法中冗余的嵌套jq调用
导出两个游标之间的匹配日志
如果需要输出匹配的日志条目而非仅统计数量,可使用以下命令:
journalctl -u my-service --after-cursor="$FIRST_CURSOR" -o json | \ jq -n --arg last_cursor "$LAST_CURSOR" --arg search_str "$SEARCH_STR" ' inputs | if .__CURSOR == $last_cursor then halt else select(.MESSAGE | test($search_str)) end '
可选调整
- 如需包含终止游标对应的日志条目,可将终止判断逻辑修改为
if .__CURSOR == $last_cursor then (select(.MESSAGE | test($search_str)) | halt) else ... - 如需忽略大小写匹配,可给
test方法添加i标志:test($search_str; "i")
内容的提问来源于stack exchange,提问作者Ken Jenney
相关产品推荐
相关产品推荐

