Json 尝试将jq与--arg选项一起使用时出现Shell引用问题

Json 尝试将jq与--arg选项一起使用时出现Shell引用问题,json,shell,jq,Json,Shell,Jq,让jq使用-r和--arg选项引用变量并避免“shell引用”问题时,我遇到了一个问题 现有主题建议使用--arg定义命令。我已经在这个shell函数中尝试过了,它的设计目的是获取日志输入并将其解析为json(如果它可以解析为json)。如果不是,它只是将其作为字符串转储 function pparselogs () { while read data do jq --arg line "$data" -R -r '. as $line | try fromjso

让jq使用
-r
--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
>回显“Hello World”| pparselogs。
jq:error:syntax error,意外的“|”,在第1行应为“$”或“[”或“{”(Unix shell引用问题?):
.as |尝试从JSON捕获
jq:1编译错误
考虑到错误是关于
|
,似乎没有提取
“$data”
arg值。但是根据上面提到的答案,这应该是解决问题的方法。我看不出我在哪里犯了错误


有人看到这里的问题了吗?

您可以将此用作shell函数:

pparselogs() {
   while read data; do
      echo "$data" | jq -rR '. as $line | try fromjson catch $line'
   done
}
然后将其与无效的json一起使用:

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

并使用有效的
json

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


您可以将其用作shell函数:

pparselogs() {
   while read data; do
      echo "$data" | jq -rR '. as $line | try fromjson catch $line'
   done
}
然后将其与无效的json一起使用:

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

并使用有效的
json

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


你能提供一些可以重现此错误的示例输入数据吗?你使用的是哪个shell?@anubhava我添加了示例输入。我只使用一个简单的字符串就得到了这个错误。
。因为$line |…
不是你想要的,它意味着“定义一个变量
$line
,它包含
所指的内容”,但是
是空的(无标准输入)。您需要更改
的值(因为它是JSON
将读取的值)对于
$line
的值,您只需使用
$line |…
即可。也就是说,使用
--arg
不必要地使事情复杂化,您最好使用标准输入,就像@anubhava在回答
jq
错误消息时所做的那样(
.as |尝试从json捕获
)表示您正在使用双引号而不是单引号来引用筛选器;
$line
在运行
jq
之前被扩展为shell参数。您能否提供一些可以重现此错误的示例输入数据。您使用的是哪个shell?@anubhava我添加了示例输入。我仅在使用简单字符串时就会出现此错误。
$line |……
不是您想要的,它的意思是“定义一个变量
$line
,它包含
所引用的内容”,但是
是空的(没有标准输入)。您想要的是更改
的值(因为它是JSON
将读取的内容)对于
$line
的值,您只需使用
$line |…
即可。也就是说,使用
--arg
不必要地使事情复杂化,您最好使用标准输入,就像@anubhava在回答
jq
错误消息时所做的那样(
.as |尝试从json捕获
)表示您正在使用双引号而不是单引号来引用筛选器;
jq
运行之前,
jq
正在作为shell参数展开。这对我也不起作用。我收到了相同的错误。我使用您提供的输入运行了
jq
,并获得了答案中所示的结果。请确保您有
jq
version
1.5
或更高版本。我在此处为上述命令创建了一个在线演示:这对我也不起作用。我得到了相同的错误。我使用您提供的输入运行了
jq
,得到了如答案所示的结果。请确保您具有
jq
版本
1.5
或更高版本。我在此处为上述命令创建了一个在线演示: