Netcat çıkışı nasıl grep


13

Canlı metin akışını grep etmeye çalışıyorum netcat, ama benim için çalışmıyor:

netcat localhost 9090 | grep sender

hiçbir şey döndürmez, ama eminim gerekir.

netcatÇıkışı bir dosyaya yönlendirir ve bazı gecikmeler eklersem (gerçek ortamı simüle et) - o zaman çalışır:

$ (sleep 5; cat netcat_output; sleep 5) | grep sender

{"jsonrpc":"2.0","method":"GUI.OnScreensaverDeactivated","params":{"data": "shuttingdown":false},"sender":"xbmc"}}

Ben de eklemek için çalıştı --line-bufferedama w / o başarı.

Neyi yanlış yapıyorum?

Düzenle:

Aynı sorunu fark ettim, sedçıktı boş.

Ancak, örneğin, hexdumpmetni hex canlıya dönüştürür:

$ 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
Belki boruya tamponlanır? Kullanmayı deneyebilirsiniz stdbuf -o0 netcat localhost 9090 | grep sender( buradan alınır )
user43791

Bu şekilde çalışıyor mu? netcat -z localhost 9090 | grep sender
Gilles Quenot

@ user43791 çıktı hala boş, ama eminim netcat eşleşen dize döndü
tomekceszke

@ sputnick bu hemen kabuğa geri döner ve bir olay için beklemez
tomekceszke

1
Hexdump'de yeni satır yok, bu yüzden grepmuhtemelen bir satırsonu bekliyor. catberi çalışıyor grepen azından bir EOF değilse bir yeni satır, alacak. Belki denemek awkile {RS olarak?
muru

Yanıtlar:


4

Karakterleri tek tek okunmaya zorlamak için read( bashbuiltin) komutunu kullanabilirsiniz :

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

Bu komut dosyasının her çıktıyı dengeleme ile yazdırması gerekir {ve }ancak komut dosyasını istediğinizi yapacak şekilde değiştirebilirsiniz. Bu senaryo hemen hemen hiçbir şeye kıyasla bir ölçütte iyi sonuç vermez, ancak oldukça basit ve benim için çalışıyor gibi görünüyor ...

Not Test numunesi eşleşen olmadığını {ve }bu gerçek girişin olduğu eğer öyleyse, sen çizgiyi yazdırmak için kriterleri değiştirmek isteyebilirsiniz.


Görünüşe göre uyumsuz diş telleri sadece çıktının başlangıcını yayınlamış olmasından kaynaklanıyor.
Barmar

8

Cevap burada: grep nc çıkışında eşleşmiyor

netcat ayrıntılı günlükleri standart hataya verir, bu yüzden grep'e geçmeden önce hataları yakalamamız gerekir.

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

Bu cevap bana çözüm getirdi. O komutu olmadan çalıştırdığımda çok garipti 2>&1, grep hiç işe yaramadı gibi görünüyor.
Marecky

2

Bence mesele netcatçıktıda yeni satırların olmamasıdır . İki geçici çözüm görüyorum:

  1. xSaniyede bir yeni satır ekleyin (eğer yeni satır ortasına eklenirse talihsiz sonuçlar doğuracaktır source):

    ( while sleep 1; do echo; done & netcat ... ) | grep source
    
  2. Yeni awksatır dışındaki bir RS ile kullanın :

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

Hala boş çıktı. Komutun doğru olduğundan emin olmak için cat netcat_output | awk -v RS='}' -v ORS='}' '/sender/',"sender":"xbmc"}
dökümü

Sadece ilk geçici çözümü kontrol ettim ve işe yarıyor ! Ancak belirttiğiniz gibi, çıktıyı bölebilir, böylece nihai çözüm olamaz. Neyse çok teşekkürler!
tomekceszke

1

--line-bufferedÇıktıda satır arabelleğe almayı kullanmak için ekleyin :

netcat localhost 9090 | grep --line-buffered sender 

Bunu zaten denedim, işe yaramadı.
tomekceszke

1

kullanmak watchkomutu:

watch 'netcat localhost 9090 | grep sender'

O da işe yaramıyor. Sed ile aynı ... Ancak, örneğin, netcat localhost 9090 | hexdump çalışıyor ve metni hex olarak değiştiriyor, neden?
tomekceszke


0

Bash'te, bir TCP bağlantısı açmak ve her zamanki gibi grep için aygıt sahte dosyaları kullanabilirsiniz. Örneğin:

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

Test etmek için aşağıdaki gibi bir dosya gönderebilen sunucuyu çalıştırın:

$ nc -vl 1234 < /etc/hosts

Daha sonra başka bir terminalde testi grepçıktıya çalıştırın :

$ grep "127" < /dev/tcp/localhost/1234
127.0.0.1   localhost
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.