首页 > 解决方案 > 尝试将 jq 与 --arg 选项一起使用时的 Shell 引用问题

问题描述

我在让 jq 使用-rand--arg选项来引用变量并避免“shell引用”问题时遇到问题。

这里的一个现有主题,建议使用--arg来定义一个命令。我已经在这个 shell 函数中进行了尝试,该函数旨在获取日志输入并将其解析为 json(如果它可解析为 json)。如果不是,它只是将其作为字符串转储。

function pparselogs () {
    while read data
    do
        jq --arg line "$data" -R -r '. as $line | try fromjson catch $line'
    done
}

我一直遇到的错误如下:

> echo "Hello World" | pparselogs .   
jq: error: syntax error, unexpected '|', expecting '$' or '[' or '{' (Unix shell quoting issues?) at <top-level>, line 1:
. as  | try fromjson catch
jq: 1 compile error

鉴于错误是在抱怨|,似乎"$data"arg 值没有被拾取。但是鉴于上面提到的答案,这应该是这样做的方法。我看不出我在哪里犯了错误。

有人看到这里的问题吗?

标签: jsonshelljq

解决方案


You may use this as shell function:

pparselogs() {
   while read data; do
      echo "$data" | jq -rR '. as $line | try fromjson catch $line'
   done
}

Then use it with invalid json:

echo 'Hello World' | pparselogs

Hello World

and with valid json:

echo '{"id":1, "message":"Hello World"}' | pparselogs

{
  "id": 1,
  "message": "Hello World"
}

推荐阅读