Próbuję grepować strumień tekstu na żywo netcat
, ale to nie działa dla mnie:
netcat localhost 9090 | grep sender
nic nie zwraca, ale jestem pewien, że powinien.
Jeśli przekieruję dane netcat
wyjściowe do pliku i dodam pewne opóźnienia (symuluję rzeczywiste środowisko) - wtedy działa:
$ (sleep 5; cat netcat_output; sleep 5) | grep sender
{"jsonrpc":"2.0","method":"GUI.OnScreensaverDeactivated","params":{"data": "shuttingdown":false},"sender":"xbmc"}}
Próbowałem też dodać, --line-buffered
ale bez sukcesu.
Co robię źle?
Edytować:
Zauważyłem ten sam problem z sed
wyjściem jest puste.
Ale na przykład hexdump
konwertuje tekst na heks na żywo:
$ 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|
stdbuf -o0 netcat localhost 9090 | grep sender
(wzięte stąd )netcat -z localhost 9090 | grep sender
grep
prawdopodobnie nieskończenie czeka na nową linię.cat
działa, ponieważgrep
dostanie EOF, jeśli nie nowy wiersz, przynajmniej. Może spróbujeszawk
z{
RS?Odpowiedzi:
Możesz użyć
read
polecenia (bash
wbudowanego), aby wymusić czytanie znaków po kolei:Ten skrypt powinien wypisywać wszystkie pełne dane wyjściowe z równoważeniem
{
i}
, ale możesz zmienić skrypt, aby zrobić co chcesz. Ten skrypt NIE poradziłby sobie dobrze w testach porównawczych w porównaniu do prawie wszystkiego, ale jest dość prosty i wydaje się, że działa dla mnie ...Należy pamiętać, że badana próbka nie ma dopasowania
{
i}
, więc jeśli jest to przypadek rzeczywistego wejścia, może chcesz zmienić kryteria drukować linię.źródło
Odpowiedź jest tutaj: grep nie pasuje do wyjścia nc
netcat wypisuje pełne dzienniki do standardowego błędu, więc musimy przechwytywać błędy przed uruchomieniem potoku do grep.
źródło
2>&1
, wygląda na to, że grep w ogóle nie działał.Myślę, że problemem jest brak nowych linii w wynikach
netcat
. Widzę dwa obejścia:Wstaw nową linię co
x
sekundę (z niefortunnymi konsekwencjami, jeśli nowa linia zostanie wstawiona w środkusource
):Użyj
awk
z RS innym niż nowa linia:źródło
cat netcat_output | awk -v RS='}' -v ORS='}' '/sender/'
,"sender":"xbmc"}
Dodaj,
--line-buffered
aby użyć buforowania linii na wyjściu:źródło
użyj
watch
polecenia:źródło
Zgodnie z komentarzem @ user43791 spróbuj wyłączyć buforowanie w potoku , np .:
źródło
W Bash możesz używać plików pseudo-urządzeń, aby otworzyć połączenie TCP i grepować je jak zwykle. Na przykład:
Aby to przetestować, po prostu uruchom serwer, który może wysłać jakiś plik, na przykład:
Następnie w innym terminalu uruchom test
grep
na wyjściu:źródło