如何使用jq

时间:2019-06-06 23:30:55

标签: json bash shell jq

如果我跑步:

cat <file> | jq 

我得到:

{
  "user": "alex",
  "num": "486",
  "time": "Thu Jun  6 16:26:06 PDT 2019",
  "pwd": "/Users/alex/codes/ores/prompt-command",
  "pid": 11047,
  "exit_code": 0,
  "cmd": "echo '123'"
}
{
  "user": "john",
  "num": "487",
  "time": "Thu Jun  6 16:26:24 PDT 2019",
  "pwd": "/Users/alex/codes/ores/prompt-command",
  "pid": 11108,
  "exit_code": 5,
  "cmd": "echo '456'"
}
{
  "user": "alex",
  "num": "488",
  "time": "Thu Jun  6 16:26:59 PDT 2019",
  "pwd": "/Users/alex/codes/ores/prompt-command",
  "pid": 11141,
  "exit_code": 5,
  "cmd": "echo '789'"
}

但是除了所有这些字段,我只想要一些输出,如:

alex echo '123'
alex echo '789'

所以我尝试了这个:

cat <file> | jq -r '.user .cmd'

但是没有用,我得到了这个错误:

  

jq:错误(在63处):无法索引字符串为“ cmd”的字符串

我也想过滤它,所以我只能看到我的命令,例如:

cat <file> | jq -r '.user=alex .cmd'

2 个答案:

答案 0 :(得分:2)

使用@tsv生成制表符分隔的值作为输出:

jq -r '[.user, .cmd] | @tsv' <yourfile

...发出,给出您的输入文件:

alex    echo '123'
john    echo '456'
alex    echo '789'

...尽管您仅过滤用户帐户,但由于用户值已知,因此您可以直接打印cmd

jq -r 'select(.user == "alex") | .cmd' 

答案 1 :(得分:2)

在编写.user .cmd时,您要在.user处请求JSON对象的“ cmd”字段。要同时获取.user和.cmd值,可以使用“,”运算符:

.user, .cmd

但是,以上内容将产生两行。有很多选项可以在一行上发出多个值。您可能希望考虑使用字符串插值;或将值包装在方括号中,然后使用@csv@tsvjoin/1之一;或使用-j命令行选项。

在标准jq文档中(参见https://stackoverflow.com/tags/jq/info)都对此进行了非常清楚的解释,以及使用select进行选择的情况。