Вывод в stdout и одновременно grep в файл

18

У меня есть скрипт, который выводит текст в stdout. Я хочу видеть весь этот вывод в моем терминале, и в то же время я хочу отфильтровать некоторые строки и сохранить их в файл. Пример:

$ myscript
Line A
Line B
Line C

$ myscript | grep -P 'A|C' > out.file

$ cat out.file
Line A
Line C

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

Лоренсо-ы
источник

Ответы:

27

Я хочу увидеть вывод первой команды в терминале и сохранить вывод второй команды в файл.

Пока вам все равно, смотрите ли вы на stdout или stderr , вы все равно можете использовать tee:

myscript | tee /dev/stderr | grep -P 'A|C' > out.file

Будет работать на Linux; Я не знаю, применимо ли / dev / stderr к другим * никсам.

лютик золотистый
источник
9
/dev/stderrраспространено /dev/tty(имеется в виду текущий терминал) также будет работать здесь, и это стандартно .
Жиль "ТАК - перестань быть злым"
@ Жиль: Замечательно. tee /dev/ttyслужил замечательно, потому что мне требовалось распечатать stdoutсценарий на терминале и передать его stdinдругой команде! Thankees! :-)
Джамадагни
8
{ ... | tee /dev/fd/3 | grep -e A -e C > out.file; } 3>&1

Или с подстановкой процесса (ksh93, zsh или bash):

... | tee >(grep -e A -e C > out.file)

С зш:

... >&1 > >(grep -e A -e C > out.file)
Стефан Шазелас
источник
Я обнаружил, что должен был использовать первый, потому что он сохраняет код выхода grep. Кроме того, если по какой-то причине вы не можете получить доступ к файловой системе / dev, ее /dev/fd/3можно заменить на>(cat 1>&3)
golvok
4

Вот еще один способ с sed:

myscript | sed '/PATTERN/w out.file'

По умолчанию sedпечатает каждую строку, поэтому в этом случае stdout будет таким же, как stdin (т.е. вы увидите весь вывод myscriptна экране).
Кроме того, все совпадающие строки PATTERNбудут wзаписаны вout.file

don_crissti
источник
-1

вы не указали, как вы использовали команду tee, но это должно работать:

myscript | grep -P 'A|C' | tee out.file

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

MelBurslan
источник
4
Но, если я не ошибаюсь, таким образом , вы Grep также то , что на экране. Я хочу видеть весь вывод на экране и фильтровать только то, что входит в файл.
Лоренцо-с