如何循环遍历大文件和输出行以通过stdin卷曲?

时间:2016-06-14 17:34:30

标签: bash stdin gnu-parallel

假设somefile包含内容

a
b
c

我希望每一行都变成3个http POST curl命令。所以第3行会将“c”发布到某个网址。

我可以使用bash循环遍历文件并像这样转储到卷曲

cat somefile | while read line; \
  do curl -XPOST 'www.example.com' -d "$line"; \
done

然而,line是一个巨大的json文件,有时通过命令行传递它会产生奇怪的事情。我宁愿有这样的东西

cat somefile | parallel curl -XPOST example.com -d @-

其中'@ - '表示每行文件都通过stdin传递给curl。 gnu parallel可以接受{}作为一个类似于上面“$ line”的参数,但我想在将文件传递给下一个命令之前将文件转换为一行文件。

3 个答案:

答案 0 :(得分:1)

ShellCheck说:

Line 1:
cat somefile | while read line; \
                     ^-- SC2162: read without -r will mangle backslashes.

这可以解释它对JSON做了奇怪的事情,JSON经常使用反斜杠:

$ echo '{ "key": "some value with \"nested quotes\" here" }' | \
      while read line; do echo "$line"; done
{ "key": "some value with "nested quotes" here" }

添加-r会让他们独自一人:

$ echo '{ "key": "some value with \"nested quotes\" here" }' | \
      while read -r line; do echo "$line"; done
{ "key": "some value with \"nested quotes\" here" }

完全正确的是,while IFS= read -r line也应保留前导空格。

相关POSIX docs for read

  

默认情况下,除非指定了-r选项,否则<反斜杠>应充当逃避品格。未转义的<反斜杠>应保留以下字符的字面值,但<换行取代。如果<换行符>遵循<反斜杠&gt ;,读取实用程序应将此解释为行继续。 <反斜杠>和<换行符>在将输入拆分为字段之前应将其删除。所有其他未转义的<反斜杠>将输入分成字段后,应删除字符。

答案 1 :(得分:1)

cat somefile | parallel 'echo {} | curl -XPOST example.com -d @-'

答案 2 :(得分:1)

cat somefile | parallel --pipe -N1 curl -XPOST example.com -d @-