我正在编写一个使用jq的bash脚本,以过滤出给定一些bash变量的JSON条目,并将每个条目中的某些键值返回到制表符分隔的文件中。我认为该命令的前几行是可以的,但是我认为第四行引起了问题。我试过用管道将第4行中的每个条目都串起来但无济于事。
info=`cat $FILE | jq -r \
' .[] \
| map(select(.host| contains(env.A))) \
| [."ip.A",."ts",."ip.B"] \
| @tsv'`
JSON示例条目:
{
"ts": "2019-06-19T00:00:00.000000Z",
"ip.A": "0.0.0.0",
"ip.B": "0.0.0.0",
"host": "www.google.com",
}
在这些文件中,文件中的整个文本没有括号。
给出错误:
jq: error (at <stdin>:0): Cannot iterate over string ("2019-06-18...)
我需要以某种特殊方式处理“ .ts”吗?
答案 0 :(得分:2)
此代码在第三行之前被 long 弄破了。
.[]
。map()
会丢弃数据(特别是,它会丢弃键,仅保留值)。 ...因此,.[]
遍历对象中的值,然后map()
尝试遍历每个值,就好像它是一个可迭代的对象一样本身,这不是...因此是您的错误。
为减少损坏部分而缩减的版本可能看起来像:
a="google.com" jq -r '
if (.host | contains(env.a)) then
[."ip.A",."ts",."ip.B"] | @tsv
else
empty
end
' <<'EOF'
{
"ts": "2019-06-19T00:00:00.000000Z",
"ip.A": "0.0.0.0",
"ip.B": "0.0.0.0",
"host": "www.google.com"
}
EOF
...效果很好。