Я пытаюсь использовать grep, чтобы получить результат регулярного выражения и передать результаты на лету в telnet, запускающий открытый порт, на сервер узла .
Команда grep принимает непрерывные, но с разным интервалом команды от запущенной программы, выводит число, а затем передает его по telnet. Вот моя попытка примера:
echo "TEST 1234\r\n" | grep -e "[0-9]{4}" | telnet 127.0.0.1 1234
Я не могу изменить строковый формат эха «обман». Эхо без grep успешно отправляет строку в telnet. Grep не делает t похоже отправляет на stdOut.
Я ожидаю, что telnet будет получать данные из канала, например:
1234
7645
8376
Любая помощь, как этого добиться?
Я не уверен, как вы пришли к выводу, что grep не выводит свои данные на стандартный вывод, это просто неверно.
Я бы посоветовал вам проверить это добавляя по одному шагу конвейера, чтобы увидеть, где возникают проблемы.
Сначала вы обнаружите, что ваша команда echo буквально печатает \ r \ n
в конце (вы можете захотеть echo -e
)и что ваша команда grep ничего не печатает (потому что ваш шаблон на самом деле не соответствует).
Однако, если вы исправите шаблон (либо grep -e "[0-9] \ {4 \} "
или grep -E" [0-9] {4} "
) вы заметите, что он печатает всю строку для всех совпадающих строк, а не только соответствующую часть (вы можете grep -o
).
Что-то вроде этого кажется более разумным началом вашего конвейера:
echo -e "TEST 1234\r\n" | grep -o -e "[0-9]\{4\}"
Вы должны иметь возможность продолжить с этого места (однако я бы предложил рассмотреть возможность использования nc
вместо telnet
).
Для этого вам не нужен telnet
, оболочка Bash имеет встроенную функцию, например:
exec {stream}<>/dev/tcp/127.0.0.1/1234
printf "TEST 1234\r\n" >&${stream}
grep -o "[0-9]\{4\}" <&${stream}