我正在尝试grep的实时文本流netcat
,但是对我来说不起作用:
netcat localhost 9090 | grep sender
什么也不会返回,但是我确定应该会返回。
如果我将netcat
输出重定向到文件并添加一些延迟(模拟真实环境),则它可以工作:
$ (sleep 5; cat netcat_output; sleep 5) | grep sender
{"jsonrpc":"2.0","method":"GUI.OnScreensaverDeactivated","params":{"data": "shuttingdown":false},"sender":"xbmc"}}
我也尝试添加--line-buffered
但没有成功。
我做错了什么?
编辑:
我注意到与相同的问题sed
,输出为空。
但是,例如,hexdump
将文本实时转换为十六进制:
$ netcat localhost 9090 | hexdump -C
00000000 7b 22 6a 73 6f 6e 72 70 63 22 3a 22 32 2e 30 22 |{"jsonrpc":"2.0"|
00000010 2c 22 6d 65 74 68 6f 64 22 3a 22 50 6c 61 79 65 |,"method":"Playe|
00000020 72 2e 4f 6e 50 6c 61 79 22 2c 22 70 61 72 61 6d |r.OnPlay","param|
00000030 73 22 3a 7b 22 64 61 74 61 22 3a 7b 22 69 74 65 |s":{"data":{"ite|
00000040 6d 22 3a 7b 22 69 64 22 3a 36 2c 22 74 79 70 65 |m":{"id":6,"type|
00000050 22 3a 22 6d 6f 76 69 65 22 7d 2c 22 70 6c 61 79 |":"movie"},"play|
00000060 65 72 22 3a 7b 22 70 6c 61 79 65 72 69 64 22 3a |er":{"playerid":|
00000070 31 2c 22 73 70 65 65 64 22 3a 31 7d 7d 2c 22 73 |1,"speed":1}},"s|
您可以使用read
命令(bash
内置)强制将字符一一读取:
netcat localhost 9090 | (
cnt=0
line=
while read -N 1 c; do
line="$line$c"
if [ "$c" = "{" ]; then
cnt=$((cnt+1))
elif [ "$c" = "}" ]; then
cnt=$((cnt-1))
if [ $cnt -eq 0 ]; then
printf "%s\n" "$line"
line=
fi
fi
done
) | grep sender
该脚本应打印所有带有balance{
和的完整输出}
,但是您可以更改脚本以执行所需的任何操作。与几乎所有内容相比,此脚本在基准测试上效果不佳,但它非常简单,似乎对我有用。
请注意,您的测试样本没有匹配的{
和}
,因此,如果是实际输入的情况,则可能需要更改条件以打印行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句