【发布时间】:2020-09-11 11:29:26
【问题描述】:
我的 curl 命令需要从流式 HTTP 服务接收连续输出。流永远不会结束。我只想从流中 grep 一个字符串,然后将此命令输出传递/管道到另一个实用程序,例如 xargs,例如,echo,以进行进一步的连续处理。
这是连续流的输出,只有在我结束运行 curl 命令时才会停止接收。
curl -X "POST" "http://localhost:8088/query" --header "Content-Type: application/json" -d $'{"ksql": "select * from SENSOR_S EMIT CHANGES;","streamsProperties": {"ksql.streams.auto.offset.reset": "earliest"}}' -s -N
[{"header":{"queryId":"none","schema":"`ROWTIME` BIGINT, `ROWKEY` STRING, `SENSOR_ID` STRING, `TEMP` BIGINT, `HUM` BIGINT"}},
{"row":{"columns":[1599624891102,"S2","S2",40,20]}},
{"row":{"columns":[1599624891113,"S1","S1",90,80]}},
{"row":{"columns":[1599624909117,"S2","S2",40,20]}},
{"row":{"columns":[1599624909125,"S1","S1",90,80]}},
{"row":{"columns":[1599625090320,"S2","S2",40,20]}},
现在,当我将输出通过管道传输到 grep 时,它按预期工作,并且我不断收到任何新事件。
curl -X "POST" "http://localhost:8088/query" --header "Content-Type: application/json" -d $'{"ksql": "select * from SENSOR_S EMIT CHANGES;","streamsProperties": {"ksql.streams.auto.offset.reset": "earliest"}}' -s -N | grep S1
{"row":{"columns":[1599624891113,"S1","S1",90,80]}},
{"row":{"columns":[1599624909125,"S1","S1",90,80]}},
但是当我将这个 grep 输出通过管道传输到 xargs 和 echo 时,输出根本不动。
curl -X "POST" "http://localhost:8088/query" --header "Content-Type: application/json" -d $'{"ksql": "select * from SENSOR_S EMIT CHANGES;","streamsProperties": {"ksql.streams.auto.offset.reset": "earliest"}}' -s -N | grep S1 | xargs -I {} echo {}
^C
当我从中间删除 grep 时,它按预期工作。
curl -X "POST" "http://localhost:8088/query" --header "Content-Type: application/json" -d $'{"ksql": "select * from SENSOR_S EMIT CHANGES;","streamsProperties": {"ksql.streams.auto.offset.reset": "earliest"}}' -s -N | xargs -I {} echo {}
[{header:{queryId:none,schema:`ROWTIME` BIGINT, `ROWKEY` STRING, `SENSOR_ID` STRING, `TEMP` BIGINT, `HUM` BIGINT}},
{row:{columns:[1599624891102,S2,S2,40,20]}},
{row:{columns:[1599624891113,S1,S1,90,80]}},
{row:{columns:[1599624909117,S2,S2,40,20]}},
{row:{columns:[1599624909125,S1,S1,90,80]}},
{row:{columns:[1599625090320,S2,S2,40,20]}},
看起来 grep 正在寻找要结束的输入,然后才能进一步管道。当我用有限的输入测试相同的东西时,它按预期工作。
ls | grep sh | xargs -I {} echo {};
abcd.sh
123.sh
pqr.sh
xyz.sh
所以,问题是:我的理解正确吗?有没有办法 grep 可以将输出实时传递给后续命令?我想在进一步的脚本中保留一些基本的过滤逻辑,因此希望 grep 工作。
提前致谢!
阿努拉格
【问题讨论】:
-
grep不等待输出结束,但grep的输出被缓冲,这意味着在输出缓冲区被填满之前,您不会看到来自grep的任何输出并脸红了。尝试使用grep的--line-buffered选项,看看是否有帮助。 -
谢谢@Larsks。是的,行缓冲选项有效。
-
@Thor - 感谢分享这个有用的链接。
标签: shell unix curl grep xargs