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 .

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.


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)

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


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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.