netcat出力をgrepする方法


13

からライブテキストストリームを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テキストを16進ライブに変換します。

$ 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|

2
多分それはパイプでバッファリングされますか?stdbuf -o0 netcat localhost 9090 | grep senderここから取得)を使用して試すことができます
user43791 14

このように機能しますか?netcat -z localhost 9090 | grep sender
Gilles Quenot、2014

@ user43791出力はまだ空ですが、netcatは一致する文字列を返した
はずです

@sputnickこれはすぐにシェルに戻り、イベントを待機しません
tomekceszke

1
hexdumpには新しい行がないgrepため、おそらく改行を無限に待っています。cat以来、働くgrep少なくとも、EOFでない場合は、改行を取得します。たぶん試みるawk{RSと?
muru 2014

回答:


4

readコマンド(bash組み込み)を使用して、文字を1つずつ強制的に読み取ることができます。

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 が一致していないことに注意してください}。したがって、これが実際の入力の場合は、基準を変更して行を印刷することができます。


中括弧の不一致のように見えるのは、彼が出力の最初を投稿しただけだからです。
Barmar 2014

8

回答はこちら: nc出力でgrepが一致しない

netcatは詳細ログを標準エラーに出力するため、grepにパイプする前にエラーをキャプチャする必要があります。

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

この答えはちょうど私を解決しました。なし2>&1でコマンドを実行すると、それは非常に奇妙でした。grepがまったく機能しないように見えます。
Marecky

2

問題は、netcat出力に改行がないことだと思います。2つの回避策があります。

  1. x秒ごとに改行を挿入します(改行がの途中に挿入された場合、残念な結果になりますsource):

    ( while sleep 1; do echo; done & netcat ... ) | grep source
    
  2. awk改行以外のRSで使用します。

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

まだ空の出力。コマンドが正しいことを確認するために、ダンプされたストリームで実行します- cat netcat_output | awk -v RS='}' -v ORS='}' '/sender/'出力は,"sender":"xbmc"}
問題ありませんでした

私は最初の回避策をチェックしたところ、うまくいきました!しかし、あなたが言ったように、それは出力を分割することができるので、それは最終的な解決策ではありません。とにかくたくさんありがとう!
tomekceszke 2014

1

--line-buffered出力でラインバッファリングを使用するために追加します。

netcat localhost 9090 | grep --line-buffered sender 

私はすでにこれを試しました、それはうまくいきませんでした。
tomekceszke 2014

1

watchコマンドを使用:

watch 'netcat localhost 9090 | grep sender'

それも動作しません。sedと同じ...しかし、たとえば、これ:netcat localhost 9090 | hexdumpは機能し、テキストをhex liveに置き換えます、なぜですか?
tomekceszke 2014


0

Bashでは、疑似デバイスファイルを使用してTCP接続を開き、通常どおりそれをgrep できます。例えば:

$ grep "sender" < /dev/tcp/example.com/1234

テストするには、次のようにファイルを送信できるサーバーを実行します。

$ nc -vl 1234 < /etc/hosts

次に、別の端末でgrep出力に対してテストを実行します。

$ grep "127" < /dev/tcp/localhost/1234
127.0.0.1   localhost
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.