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 .

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.


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)

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


-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 ...


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.