Я пытаюсь получить доступ к текстовому потоку 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|
stdbuf -o0 netcat localhost 9090 | grep sender
(взято отсюда )netcat -z localhost 9090 | grep sender
grep
, вероятно, бесконечно ждем новой строки.cat
работает, такgrep
как получит EOF, если не новую строку, по крайней мере. Может попробоватьawk
с ,{
как RS?Ответы:
Вы можете использовать
read
команду (bash
встроенную) для принудительного чтения символов один за другим:Этот скрипт должен печатать каждый полный вывод с балансировкой
{
и}
, но вы можете изменить скрипт так, чтобы он делал все, что вы хотите. Этот сценарий НЕ подходит для теста по сравнению с чем угодно, но он довольно прост и, кажется, работает для меня ...Обратите внимание, что в вашем тестовом образце не было совпадения,
{
и}
поэтому, если это реальный ввод, вы можете изменить критерии для печати строки.источник
Ответ здесь: grep не совпадает в выводе nc
netcat выводит подробные журналы со стандартной ошибкой, поэтому нам нужно фиксировать ошибки, прежде чем мы перейдем к grep.
источник
2>&1
, похоже, что grep вообще не работает.Я думаю, что проблема заключается в отсутствии новых строк в
netcat
выводе. Я вижу два обходных пути:Вставлять новую строку каждые
x
секунды (с печальными последствиями, если новая строка вставляется в серединеsource
):Используйте
awk
с RS, кроме newline:источник
cat netcat_output | awk -v RS='}' -v ORS='}' '/sender/'
вывод был в порядке:,"sender":"xbmc"}
Добавьте
--line-buffered
для использования буферизации строки на выходе:источник
используйте
watch
команду:источник
Как на @ user43791 комментарий , попробуйте отключить буферизацию в трубе , например:
источник
В Bash вы можете использовать файлы псевдоустройств, чтобы открыть TCP-соединение и выполнить его как обычно. Например:
Чтобы проверить это, просто запустите сервер, который может отправить некоторый файл, например:
Затем в другом терминале запустите тест до
grep
выхода:источник