使用awk进行JSON解析



我有大量的服务器日志。结构如下。我正在尝试从json文件中提取数字唯一的requestId值。requestId是一个键,可能有许多相同的requestId值。我想提取唯一的requestId。如果输入文件中的字段可以不同,则为顺序。

input.txt

{
"timestamp":"2021-05-06T20:33:47.986Z",
"logger_name":"c.a.p.r.engine.Taxengine",
"thread_name":"http-nio-8080-exec-18",
"level":"INFO",
"serviceArchPath":"rb.amxp.Taxfiler",
"process":"NA",
"message":"Deployment successfully",
"requestId":"CFLGftt2hfrBhr6Ltyjdx"
},
{
"newField":"tempfield", 
"timestamp":"2021-05-06T20:33:47.986Z",
"logger_name":"c.a.p.r.engine.Taxengine",
"thread_name":"http-nio-8080-exec-18",
"level":"INFO",
"serviceArchPath":"rb.amxp.Taxfiler",
"process":"NA",
"message":"Deployment successfully",
"requestId":"DELGongDKGbehr6Lsak"
},
{
"timestamp":"2021-05-06T20:33:47.986Z",
"logger_name":"c.a.p.r.engine.Taxengine",
"thread_name":"http-nio-8080-exec-18",
"level":"INFO",
"serviceArchPath":"rb.amxp.Taxfiler",
"process":"NA",
"message":"Deployment successfully",
"requestId":"CFLGftt2hfrBhr6Ltyjdx"
},

我可以获得帮助来记录请求ID的数量并显示它们吗。谢谢你的帮助。

尝试以下操作:

awk 'BEGIN { FS = """ } /requestId/ { print $(NF - 1) }' input.txt

这基本上使用"作为字段分隔符,如果它看到requestId,则提取倒数第二个字段。

Ouptut:

CFLGftt2hfrBhr6Ltyjdx
DELGongDKGbehr6Lsak
CFLGftt2hfrBhr6Ltyjdx

如果需要,您可以通过管道将其发送到sort --unique

但我不太确定awk是否是完成这项任务的工具。正如注释所示,其他更简单的工具或以json为目标的工具可能会更好。

根据其他人的建议,如果jq可用,请尝试:

jq -r '[.[].requestId] | unique | .[]' input.txt

输出:

CFLGftt2hfrBhr6Ltyjdx
DELGongDKGbehr6Lsak

请注意,输入文件是通过删除尾部逗号重新格式化的并用方括号括起来,形成一个有效的json文件。

最新更新