Wyjście na standardowe wyjście i jednocześnie grep do pliku

18

Mam skrypt, który wyświetla tekst na adres stdout. Chcę zobaczyć wszystkie te dane wyjściowe w moim terminalu, a jednocześnie chcę przefiltrować niektóre wiersze i zapisać je w pliku. Przykład:

$ myscript
Line A
Line B
Line C

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

$ cat out.file
Line A
Line C

Chcę zobaczyć wynik pierwszego polecenia w terminalu i zapisać wynik drugiego polecenia w pliku. W tym samym czasie. Próbowałem użyć tee, ale bez rezultatu lub lepiej, z wynikiem odwróconym .

Lorenzo-s
źródło

Odpowiedzi:

27

Chcę zobaczyć wynik pierwszego polecenia w terminalu i zapisać wynik drugiego polecenia w pliku.

Tak długo, jak nie obchodzi mnie, czy to, czego szukasz na to z stdout lub stderr , nadal można korzystać z tee:

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

Działa na Linuksie; Nie wiem, czy „/ dev / stderr” ma również zastosowanie do innych * nixów.

Złotowłosa
źródło
9
/dev/stderrjest powszechne. /dev/tty(czyli obecny terminal) też tu by działało i jest to standard .
Gilles 'SO - przestań być zły'
@Gilles: Cudownie. tee /dev/ttysłużyło wspaniale, ponieważ wymagałem wydrukowania stdoutskryptu na terminalu i przesłania go również do stdininnego polecenia! Dziękuję! :-)
jamadagni
8
{ ... | tee /dev/fd/3 | grep -e A -e C > out.file; } 3>&1

Lub z podstawieniem procesu (ksh93, zsh lub bash):

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

Z zsh:

... >&1 > >(grep -e A -e C > out.file)
Stéphane Chazelas
źródło
Odkryłem, że musiałem użyć pierwszego, ponieważ zachowuje on kod wyjścia grep. Ponadto, jeśli z jakiegoś powodu nie możesz uzyskać dostępu do systemu plików / dev, /dev/fd/3możesz go zastąpić>(cat 1>&3)
golvok
4

Oto inny sposób sed:

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

Domyślnie sedwypisuje każdą linię, więc w tym przypadku standardowe wyjście będzie takie samo jak standardowe (tzn. Zobaczysz cały wynik myscriptna ekranie).
Ponadto wszystkie pasujące linie PATTERNzostaną przypisane wdoout.file

don_crissti
źródło
-1

nie określiłeś sposobu użycia polecenia tee, ale powinno to działać:

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

przynajmniej działało na moim serwerze kilka minut temu ...

MelBurslan
źródło
4
Ale jeśli się nie mylę, w ten sposób grepujesz także to, co jest na ekranie. Chcę zobaczyć wszystkie dane wyjściowe na ekranie i filtrować tylko zawartość pliku.
lorenzo-s