Output ke stdout dan pada saat yang sama masuk ke file

18

Saya memiliki skrip yang menampilkan teks stdout. Saya ingin melihat semua output ini di terminal saya, dan pada saat yang sama saya ingin memfilter beberapa baris dan menyimpannya dalam file. Contoh:

$ myscript
Line A
Line B
Line C

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

$ cat out.file
Line A
Line C

Saya ingin melihat output dari perintah pertama di terminal, dan menyimpan output dari perintah kedua dalam sebuah file. Pada waktu bersamaan. Saya mencoba menggunakan tee, tetapi tanpa hasil, atau lebih baik, dengan hasil terbalik .

lorenzo-s
sumber

Jawaban:

27

Saya ingin melihat output dari perintah pertama di terminal, dan menyimpan output dari perintah kedua dalam sebuah file.

Selama Anda tidak peduli apakah yang Anda lihat berasal dari stdout atau stderr , Anda masih bisa menggunakan tee:

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

Akan bekerja di linux; Saya tidak tahu apakah "/ dev / stderr" sama-sama berlaku pada * nixes lainnya.

goldilocks
sumber
9
/dev/stderritu biasa. /dev/tty(artinya terminal saat ini) juga akan berfungsi di sini, dan itu standar .
Gilles 'SO- stop being evil'
@Gilles: Luar biasa. tee /dev/ttyberfungsi luar biasa untuk persyaratan saya harus mencetak stdoutskrip ke terminal dan untuk pipa itu ke stdinperintah lain juga! Terima kasih! :-)
jamadagni
8
{ ... | tee /dev/fd/3 | grep -e A -e C > out.file; } 3>&1

Atau dengan substitusi proses (ksh93, zsh atau bash):

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

Dengan zsh:

... >&1 > >(grep -e A -e C > out.file)
Stéphane Chazelas
sumber
Saya menemukan saya harus menggunakan yang pertama karena mempertahankan kode keluar grep. Juga, jika karena alasan tertentu Anda tidak dapat mengakses sistem file / dev, /dev/fd/3dapat diganti dengan>(cat 1>&3)
golvok
4

Inilah cara lain dengan sed:

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

Secara default, sedmencetak setiap baris sehingga dalam hal ini stdout akan sama dengan stdin (yaitu Anda akan melihat seluruh output myscriptpada layar).
Selain itu, semua baris yang cocok PATTERNakan ditulis wulangout.file

don_crissti
sumber
-1

Anda tidak menentukan bagaimana Anda menggunakan perintah tee tetapi ini harus bekerja:

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

setidaknya itu berfungsi di server saya beberapa menit yang lalu ...

MelBurslan
sumber
4
Tapi, jika saya tidak salah, dengan cara ini Anda juga menangkap apa yang ada di layar. Saya ingin melihat semua output di layar, dan hanya memfilter apa yang masuk ke file.
lorenzo-s