如何使用jq为json数组中的每个json对象运行bash命令?到目前为止我有这个:
cat credentials.json | jq -r '.[] | .user, .date, .email' | mycommand -u {user} -d {date} -e {email}
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用.如何从json数组中取出参数到我的命令中?
我的json文件看起来像这样:
[
"user": "danielrvt",
"date": "11/10/1988",
"email": "myemail@domain.com",
...
]
Run Code Online (Sandbox Code Playgroud)
che*_*ner 20
你最好的选择可能是以TSV格式输出每个记录,然后从shell循环中读取.
jq -r '.[]|[.user, .date, .email] | @tsv' |
while IFS=$'\t' read -r user date email; do
mycommand -u "$user" -d "$date" -e "$email"
done
Run Code Online (Sandbox Code Playgroud)
jq本身没有像system过滤器中运行外部命令的调用,尽管看起来他们正在研究它.
koj*_*iro 11
您可以jq输出要执行的命令,例如
.[] | "mycommand \(.user|@sh) \(.date|@sh) \(.email|@sh)"
Run Code Online (Sandbox Code Playgroud)
然后执行它.就像是
bash <(jq -r '.[] | "mycommand \(.user|@sh) \(.date|@sh) \(.email|@sh)"' foo)
Run Code Online (Sandbox Code Playgroud)
使用xargs:
curl localhost:8082/connectors | jq .[] | xargs -L1 -I'{}' curl -XDELETE 'localhost:8082/connectors/{}'
Run Code Online (Sandbox Code Playgroud)
或者等效地,显示第一个curl的输出:
echo '["quickstart-file-sink4","quickstart-file-source","quickstart-file-sink","quickstart-file-sink2","quickstart-file-sink3","quickstart-file-source2"]' | jq .[] | xargs -L1 -I'{}' curl -XDELETE 'localhost:8082/connectors/{}'
Run Code Online (Sandbox Code Playgroud)
jq .[] 剥离一个封闭级别,以便每个项目一个列表输出为一行。
xargs -L1 一次处理一行
xargs -I'{}'指定{}在调用以下命令时将字符串替换为输入行。
xargs 本质上是外壳的映射运算符。
这是我基于@chepner 的回答的另一种变体。
echo "$config" | jq -c '.[]' |
while IFS=$"\n" read -r c; do
echo "start"
host=$(echo "$c" | jq -r '.host')
echo $host
echo "end"
done
Run Code Online (Sandbox Code Playgroud)
我使用 jq 的 -c 选项来输出“紧凑”的 jsons,所以它们都在一行上。
与 结合使用IFS=$"\n",我能够遍历输入 json 数组中的每个项目并做我想做的事情。
所以,输入
[
{
"host": "host1",
"settings": {}
},
{
"host": "host1",
"settings": {}
}
]
Run Code Online (Sandbox Code Playgroud)
输出是
start
host1
end
start
host2
end
Run Code Online (Sandbox Code Playgroud)
我最近遇到了同样的问题,由于我想传递相对复杂的参数集, xargs 没有多大帮助。因此我sh为 jq 实现了一个过滤器(及其朋友)。我还没有足够的时间为它编写文档和测试,因此还没有创建 PR 以使其成为官方代码库的一部分。所以现在它只适合那些愿意自己编译这个版本的人:
https://github.com/haochenx/jq/tree/sh-support