如何使用grep实用程序处理连续流输出?

问题描述

我有一个要求,其中我的curl命令要从流HTTP服务接收连续输出。流永远不会结束。我只想从流中提取一个字符串,然后将此命令输出传递/传递给另一个实用程序(例如xargs),并说回声作为示例,以进行进一步的连续处理。

这是连续流的输出,只有在结束运行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",40,20]}},{"row":{"columns":[1599624891113,"S1",90,80]}},{"row":{"columns":[1599624909117,{"row":{"columns":[1599624909125,{"row":{"columns":[1599625090320,

现在,当我将输出通过管道传输到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,

但是当我将此grep输出通过管道传递给xargs并回显时,输出根本就不会移动。

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,`HUM` BIGINT}},{row:{columns:[1599624891102,S2,{row:{columns:[1599624891113,S1,{row:{columns:[1599624909117,{row:{columns:[1599624909125,{row:{columns:[1599625090320,

看起来grep正在寻找输入端,然后才能进一步传递输入端。当我用有限的输入测试同一件事时,它可以按预期工作。

ls | grep sh | xargs -I {} echo {};

abcd.sh
123.sh
pqr.sh
xyz.sh

因此,问题是:我的理解正确吗? grep是否可以保持将输出实时传递给后续命令的方法?我想在进一步的脚本编写中保留一些基本的过滤逻辑,因此希望grep可以工作。

预先感谢!

Anurag

解决方法

如@larsks所建议的那样,当测试与您相似的要求时,grep的“ --line-buffered每行刷新输出”选项可以正常工作。

所以命令应该是

curl -X“ POST”“ http:// localhost:8088 / query” --header“ Content-Type:application / json” -d $'{“ ksql”:“从SENSOR_S EMIT CHANGES中选择*;” ,“ streamsProperties”:{“ ksql.streams.auto.offset.reset”:“最早”}}'-s -N | grep S1-行缓冲| xargs -I {} echo {}

我在“ / var / log / messages”文件上进行了测试,该文件不断更新如下:

[root @ project1-master〜]#tail -f / var / log / messages | grep journal-行缓冲| xargs -I {} echo {}

9月11日11:15:47 project1-master日志:I0911 15:15:47.448254 1 node_lifecycle_controller.go:1429]初始化区域的驱逐指标:

9月11日11:15:52 project1-master日志:I0911 15:15:52.448704 1 node_lifecycle_controller.go:1429]初始化区域的驱逐指标:

Sep 11 11:15:54 project1-master journal:2020-09-11 15:15:54.006 [INFO] [46] felix / int_dataplane.go 1300:应用数据平面更新