jq命令抛出错误“无法遍历字符串”,当

时间:2019-06-19 20:29:20

标签: bash jq

我正在编写一个使用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”吗?

1 个答案:

答案 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

...效果很好。