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)
当您编写时,.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进行选择一样。
使用@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)