我有一个json输出,以其中的一个值表示linux命令:
... ,"proc.cmdline":"sh -c pgrep -fl \"unicorn.* worker\[.*?\]\"", ...
在某些情况下,该命令包含反斜杠,因此输出的json也将包含反斜杠。
我需要用jq解析输出,但是它失败并出现错误:
parse error: Invalid escape at line 1, column 373
它是指:\[
但是,这是命令的一部分,因此应该存在。
如果手动编辑该行,将\[
转换为\\[
,则该行通过。但是,结果输出包含两个反斜杠:
...
"proc.cmdline": "sh -c pgrep -fl \"unicorn.* worker\\[.*?\\]\"",
...
现在,我不能每次都在那里进行手动编辑。此输出是由另一个软件自动产生的,每次输入时我都需要用jq对其进行解析。
此外,即使我能够将每个\[
编辑为\\[
(例如使用sed
之类的东西),输出也会变成谎言,第二个\
是假的。
关于如何解决此问题的任何想法?
编辑:这是完整的json供参考(由我正在使用的程序(falco)的输出原始接收):
{"priority":"Debug","rule":"Run shell untrusted","time":"2019-05-15T07:32:36.597411997Z", "output_fields": {"evt.time":1557905556597411997,"proc.aname[2]":"gitlab-mon","proc.aname[3]":"runsv","proc.aname[4]":"runsvdir","proc.aname[5]":"wrapper","proc.aname[6]":"docker-containe","proc.aname[7]":"docker-containe","proc.cmdline":"sh -c pgrep -fl \"unicorn.* worker\[.*?\]\"","proc.name":"sh","proc.pcmdline":"reactor.rb:249 ","proc.pname":"reactor.rb:249","user.name":null}}
答案 0 :(得分:1)
JSON标准非常明确地说明了必须转义哪些字符,[
不是其中的一个(尽管反向固线-\
是)。因此,是由您的脚本/软件生成的JSON违反了JSON标准-您可以在任何知名的在线JSON验证器上对其进行验证,例如,像这样的https://jsoncompare.com/#!/simple/-它也会产生错误。
如果您无法增强/修复生成该JSON的脚本,那么您需要确保在传递给JSON处理器之前,对那些不合规定的引号加双引号:
... | sed -E 's/\\([][])/\\\\\1/g' | ...
答案 1 :(得分:1)
您将需要修复生成“ json”字符串的任何内容。使用可产生兼容json的内容。
如果这不是您的选择,那么您将必须对其进行修改,以便它是有效的json。幸运的是jq
可以解决这个问题。原始读取它,修复字符串然后解析。
假设我们只需要修复\[
和\]
的顺序:
$ ... | jq -R 'gsub("\\\\(?<c>[[\\]])"; "\\\\\(.c)") | fromjson | "your filter"'
请记住,"sh -c pgrep -fl \"unicorn.* worker\\[.*?\\]\""
是带有转义符的字符串...它表示值:
sh -c pgrep -fl "unicorn.* worker\[.*?\]"
因此,“两个反斜杠”都是绝对正确的。