2016-02-09 2 views
2

Я запускаю инструмент Unix, который принимает опцию -l log_file. Я хотел бы переадресовать, что в трубу, что-то вроде этого:Как перенаправить вывод текстового файла в трубу?

my_tool -l /dev/tty | grep "Aye, Caramba!" 

К сожалению, когда я указываю /dev/tty выводить my_tool «s идет непосредственно в окно консоли, минуя grep.

Я также пробовал /dev/stdout, безрезультатно.

Таким образом, вопрос: что мне нужно указать для опции -l выше, чтобы захватить соответствующий выход в трубу?

+1

Что произойдет, если вы выполняете 'my_tool -l/dev/stdout' без трубы? Он записывается в стандартный вывод? Если нет, с 'my_tool' происходит что-то еще. – dimo414

ответ

2

Вы можете использовать process substitution для создания дескриптора файла, который передает любое содержимое, записанное в дескриптор через конвейер команд.

Например, это должно работать:

my_tool -l >(grep "Aye, Caramba!" > path/to/store/partial.log) 

Это проходит my_tool на /dev/fd/XXX путь, по которому он может писать в. Любое содержимое, записанное на этот путь, отправляется через grep, а затем записывается в файл partial.log.

Функционально это похоже на предложение Кенстера использовать именованные каналы, но замену процесса часто легче работать и, по моему мнению, рассуждать.

0

Это может быть полезно, чтобы запустить один процесс генерации журнала, а другие следующий журнал создается и оглавление его выхода

Чтобы сделать это таким образом, в одной консоли можно запустить my_tool, создавая нужный журнал.

my_tool -l /tmp/mylog 

Затем в другой консоли можно запустить:

tail -f -n+0 /tmp/mylog | grep --line-buffered the_pattern_to_match 

tail напечатает «последние» строки файла, переданного в качестве аргумента. -n+0 говорит хвосту обрабатывать полный файл до того места, где он был написан. -f скажите хвосту, чтобы файл оставался открытым и продолжал отправлять все, что поступает на стандартный вывод (в этом случае перенаправляется на канал).

Тогда в grep вам понадобится --line-buffered, чтобы он не дождался завершения хвоста, прежде чем он распечатает свой собственный результат.

Надеюсь, это поможет.

2

Вы можете попробовать использовать named pipe:

mkfifo pipe 
grep "Aye, Caramba!" pipe & 
my_tool -l pipe 

В этом примере Grep откроется pipe для чтения, который будет блокировать, пока другой процесс не открывает его для записи. Когда my_tool записывает данные в канал, grep сможет считывать данные. Когда my_tool закроет pipe, grep получит индикацию конца файла и выход.

0

Попробуйте my_tool -l /dev/stdout | grep

Кроме того, как предположил Зак, сама команда может поддерживать какой-то другой вариант.

Смежные вопросы