shell 从文件读取JSON对象并将每个对象传递给cURL

cu6pst1q  于 2023-02-13  发布在  Shell
关注(0)|答案(3)|浏览(150)

我有一个包含时间戳和JSON对象的文件access.log,用换行符分隔:

09:52:11 { "key1": "value", "key2": 2, "key3": true }\n
09:52:13 { "key4": "value2", "key5": 5, "key6": false }\n
09:55:33 { "key7": "value7", "key8": 8, "key9": true }\n
...

我需要逐行读取文件,提取JSON对象,并将每个对象作为请求主体传递给cURL。我尝试用xargs解决这个问题,但它将{}传递给请求主体:

cat access.log | cut -c10- | xargs -0 -I {} curl -X POST-H "Content-Type: application/json" http://localhost:8080/api/ -d '{}'
cat access.log | cut -c10- | xargs -0 -I {} curl -X POST-H "Content-Type: application/json" http://localhost:8080/api/ -d {}

我在语法上有个错误。我做错了什么?
UPDATE:\n不是一个文本值。因此,通过发出cat access.log,结果为:

09:52:11 { "key1": "value", "key2": 2, "key3": true }
09:52:13 { "key4": "value2", "key5": 5, "key6": false }
09:55:33 { "key7": "value7", "key8": 8, "key9": true }
...
jbose2ul

jbose2ul1#

你不应该给xargs传递-0 a-它会让xargs期望零字符作为分隔符。因为你没有零字符,它会把所有的输入当作一条记录传递给curl。删除-0可以修复它。另外,-I选项让xargs使用换行符作为分隔符,而不是空格。
使用echo i/o curl更容易看到。比较cat aa.log | cut -c10- | xargs -0 -I {} echo %%'{}'%%的输出,

%%{ "key1": "value", "key2": 2, "key3": true }
{ "key4": "value2", "key5": 5, "key6": false }
{ "key7": "value7", "key8": 8, "key9": true }
%%

cat aa.log | cut -c10- | xargs -I {} echo %%'{}'%%输出,即

%%{ key1: value, key2: 2, key3: true }%%
%%{ key4: value2, key5: 5, key6: false }%%
%%{ key7: value7, key8: 8, key9: true }%%

另外,您可以使用-t选项查看xargs构建的命令

70gysomp

70gysomp2#

use:

#!/bin/bash
cat access.log | sed 's/\\n//g' > access_temp.log
echo ""
while IFS='' read -r line || [[ -n "$line" ]]; do
    json_string=$(echo "$line" | awk '{$1=""; print $0}' | jq -c .)
    curl -X POST -H "Content-Type: application/json" -d "$json_string" http://localhost:8080/api/
done < "access_temp.log"
rm access_temp.log

一开始的sed是因为'\n'扰乱了jq命令,所以我不得不删除它。
您可以添加echo,或者在开头设置-x来检查传递的值。

zbwhf8kr

zbwhf8kr3#

我认为这应该可以实现--用dash这样的轻量级 shell Package xargs

printf '%s' '
     09:52:11 { "key1": "value",  "key2": 2, "key3": true  }\n
     09:52:13 { "key4": "value2", "key5": 5, "key6": false }\n
     09:55:33 { "key7": "value7", "key8": 8, "key9": true  }\n' | 

 mawk NF=NF FS='^[^{]*' OFS= ORS='\0' | 

 xargs -0 dash -v -x -c '
  
    for __; do 

        curl -s -X POST-H '\''Content-Type: application/json'\'' \
                     --url '\''https://localhost:8080/api'\'' -d "$__"

    done ' _
+ curl -s -X POST-H Content-Type: application/json --url 
  https://localhost:8080/api -d { "key1": "value", "key2": 2, "key3": true }
+ curl -s -X POST-H Content-Type: application/json --url 
  https://localhost:8080/api -d { "key4": "value2", "key5": 5, "key6": false }
+ curl -s -X POST-H Content-Type: application/json --url 
  https://localhost:8080/api -d { "key7": "value7", "key8": 8, "key9": true }

dash-v(erbose) -x(trace)标志完全是可选的,在这种情况下,它们可以作为xargs -t的粗略代理。

相关问题