我有一些来自 Linux 机器上的 Web 服务的日志。日志如下所示:
{"log":"[2023-03-09T06:39:10.669Z] \"GET /server/prod?blank=true HTTP/1.1\" 200 - 0 874 1 1 \"-\" \"-\" \"aaad-bbb-ccc-dd-eeeee\" \"example.com:22213\" \"172.16.2.1:10080\"\n","stream":"stdout","time":"2023-03-09T06:39:11.935831787Z"}
如您所见,有一些双引号。我需要打印第三个和第四个双引号之间以及第11个和第12个双引号之间的内容。意思是我想获取如下内容:
"GET /server/prod?blank=true HTTP/1.1\" "example.com:22213\"
我只关心内容。我不关心"
或\
。
使用
jq
,您可以提取和解码密钥的值log
:这本质上是一个使用空格字符作为字段分隔符的无头 CSV 记录,因此我们可以使用Miller ( )等 CSV 感知工具
mlr
从中解析出第 2 个和第 12 个字段:为了使其更易于解析,您可能需要使用 TSV 输出格式:
由于第一个字段不再包含嵌入式分隔符,因此 Miller 会自动删除引号。
--csv
请注意to的变化--c2t
(与 一起--icsv
)--otsv
和 from--fs
to--ifs
(仅设置输入字段分隔符,而不设置输出字段分隔符)。在这种情况下,更改--fs space
为--ifs space --ofs tab
会产生与 Miller 将 TSV 和 CSV 相同的效果(只是字段分隔符不同)。根据我的计算,您需要第四个和第五个双引号之间的文本,然后是第十二个和第十三个双引号之间的文本:
(使用
sed
支持扩展的正则表达式,如 GNU、各种 BSD 或 Busybox)或(使用任何
sed
)。一个示例
awk
脚本就可以完成这项工作。这使用"
字符作为字段分隔符,因此第一个字段 ($1
) 是第一个字段之前的部分"
,等等。如果你也想删除反斜杠,你可以
gsub()
在脚本中使用 eg 来做到这一点: