如何 grep netcat 输出

如何 grep netcat 输出

我正在尝试 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|

答案1

答案在这里: grep 在 nc 输出中不匹配

netcat 将详细日志输出到标准错误,因此我们需要在通过管道传输到 grep 之前捕获错误。

$ netcat -zv localhost 1-9000 2>&1 | grep succeeded

答案2

您可以使用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

该脚本应使用平衡{和打印每个完整输出},但您可以更改脚本以执行您想要的任何操作。与几乎任何东西相比,这个脚本在基准测试中表现不佳,但它非常简单并且似乎对我有用......

请注意,您的测试样本没有匹配的{and },因此如果这是真实输入的情况,您可能需要更改打印该行的条件。

答案3

我认为问题在于输出中缺少换行符netcat。我可以看到两种解决方法:

  1. 每秒插入一个换行符x(如果换行符插入到 的中间,则会产生不幸的后果source):

    ( while sleep 1; do echo; done & netcat ... ) | grep source
    
  2. awk与换行符以外的 RS 一起使用:

    netcat ... | awk -v RS='}' -v ORS='}' '/source/'
    

答案4

按照@user43791 评论, 尝试禁用管道中的缓冲,例如:

stdbuf -o0 netcat localhost 9090 | grep sender

相关内容