Контролировать и условно действовать при непрерывном выводе команды

257
dave mankoff

В bash у меня есть команда, работающая на экране:

while true do echo $RANDOM sleep 1 done 

Выход которого:

12396 19683 31641 ... 

Я хотел бы передать это в что-то вроде grep / awk, и я соответствую определенному шаблону, такому как 12345, я хочу выполнить команду.

Я не хочу фиксировать полный вывод команды выполнения - она ​​может выполняться очень долго, пока не будет найдено совпадение, и я не хочу тратить место на машине.

Это можно легко сделать в bash?

В идеальном мире я также хотел бы, чтобы вывод продолжал печататься на терминале, чтобы я мог удаленно входить и контролировать выход, но это не является строго необходимым.

1

1 ответ на вопрос

1
Kamil Maciorowski
./feeding_script.sh | tee >(while read a; do [ "$a" == "12345" ] && </dev/null another_command; done) 

Заметки:

  • teeразбивает поток данных; одна копия отправляется в «файл», который в данном случае является командой >(…), а другая - в терминал;
  • </dev/null another_command- это перенаправление предотвращает another_commandиспользование данных, сгенерированных feeding_script.sh.
Почему Xen2050 6 лет назад 0
@ Xen2050 Если `another_command` может выдавать себя из` stdin` (без перенаправления), то он сможет использовать любое количество строк, следующих за инициирующим `12345`. Эти строки никогда не пойдут в «пока читаю…». Я предполагал, что все они должны пойти туда и пройти тестирование. Но * если * идея состоит в том, чтобы обнаружить `12345` в качестве заголовка, который предшествует данным, которые * должны идти * в` another_command`, тогда ` Kamil Maciorowski 6 лет назад 0