如何使用jq将多个字段连接到同一行

Ale*_*lls 3 bash shell json jq

如果我运行:

cat <file> | jq 
Run Code Online (Sandbox Code Playgroud)

我得到:

{
  "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'"
}
Run Code Online (Sandbox Code Playgroud)

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

alex echo '123'
alex echo '789'
Run Code Online (Sandbox Code Playgroud)

所以我试过这个:

cat <file> | jq -r '.user .cmd'
Run Code Online (Sandbox Code Playgroud)

但这不起作用我收到了这个错误:

jq:错误(在:63):无法使用字符串“cmd”索引字符串

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

cat <file> | jq -r '.user=alex .cmd'
Run Code Online (Sandbox Code Playgroud)

pea*_*eak 9

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

.user, .cmd
Run Code Online (Sandbox Code Playgroud)

然而,上面的代码会产生两条线。有许多选项可以在一行上发出多个值。您可能希望考虑使用字符串插值;或将值括在方括号中,然后使用@csv@tsv或 之一join/1;或使用 -j 命令行选项。

标准 jq 文档(参见https://stackoverflow.com/tags/jq/info )中对此进行了非常清楚的解释,就像使用select进行选择一样。


Cha*_*ffy 6

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

jq -r '[.user, .cmd] | @tsv' <yourfile
Run Code Online (Sandbox Code Playgroud)

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

alex    echo '123'
john    echo '456'
alex    echo '789'
Run Code Online (Sandbox Code Playgroud)

...虽然如果你只过滤你的用户帐户,你可以直接打印cmd,因为用户值是已知的:

jq -r 'select(.user == "alex") | .cmd' 
Run Code Online (Sandbox Code Playgroud)