如果我跑步:
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'
答案 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
,@tsv
或join/1
之一;或使用-j命令行选项。
在标准jq文档中(参见https://stackoverflow.com/tags/jq/info)都对此进行了非常清楚的解释,以及使用select
进行选择的情况。