我有一个包含时间戳和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 }
...
3条答案
按热度按时间jbose2ul1#
你不应该给xargs传递-0 a-它会让xargs期望零字符作为分隔符。因为你没有零字符,它会把所有的输入当作一条记录传递给curl。删除-0可以修复它。另外,
-I
选项让xargs使用换行符作为分隔符,而不是空格。使用echo i/o curl更容易看到。比较
cat aa.log | cut -c10- | xargs -0 -I {} echo %%'{}'%%
的输出,从
cat aa.log | cut -c10- | xargs -I {} echo %%'{}'%%
输出,即另外,您可以使用
-t
选项查看xargs构建的命令70gysomp2#
use:
一开始的sed是因为'\n'扰乱了jq命令,所以我不得不删除它。
您可以添加echo,或者在开头设置-x来检查传递的值。
zbwhf8kr3#
我认为这应该可以实现--用
dash
这样的轻量级 shell Packagexargs
:dash
的-v(erbose) -x(trace)
标志完全是可选的,在这种情况下,它们可以作为xargs -t
的粗略代理。