Output su stdout e allo stesso tempo grep in un file


18

Ho uno script che genera testo in stdout. Voglio vedere tutto questo output nel mio terminale, e allo stesso tempo voglio filtrare alcune linee e salvarle in un file. Esempio:

$ myscript
Line A
Line B
Line C

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

$ cat out.file
Line A
Line C

Voglio vedere l'output del primo comando nel terminale e salvare l'output del secondo comando in un file. Allo stesso tempo. Ho provato a usare tee, ma senza risultato, o meglio, con risultato invertito .

Risposte:


27

Voglio vedere l'output del primo comando nel terminale e salvare l'output del secondo comando in un file.

Finché non ti importa se quello che stai guardando proviene da stdout o stderr , puoi comunque usare tee:

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

Funzionerà su Linux; Non so se "/ dev / stderr" sia ugualmente applicabile su altri * nix.


9
/dev/stderrè comune. /dev/tty(intendendo l'attuale terminale) funzionerebbe anche qui, ed è standard .
Gilles 'SO- smetti di essere malvagio' il

@Gilles: meraviglioso. tee /dev/ttyservito meravigliosamente per il mio requisito di dover stampare lo stdoutscript sul terminale e di inoltrarlo anche a quello stdindi un altro comando! Thankees! :-)
jamadagni,

8
{ ... | tee /dev/fd/3 | grep -e A -e C > out.file; } 3>&1

O con sostituzione del processo (ksh93, zsh o bash):

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

Con zsh:

... >&1 > >(grep -e A -e C > out.file)

Ho scoperto che dovevo usare il primo perché preservava il codice di uscita di grep. Inoltre, se per qualche motivo non è possibile accedere al filesystem / dev, è /dev/fd/3possibile sostituirlo con>(cat 1>&3)
golvok

4

Ecco un altro modo con sed:

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

Per impostazione predefinita, sedstampa ogni riga, quindi in questo caso stdout sarà uguale a stdin (ovvero vedrai l'intero output di myscriptsullo schermo).
Inoltre, tutte le righe corrispondenti PATTERNverranno wscritteout.file


-1

non hai specificato come hai usato il comando tee ma questo dovrebbe funzionare:

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

almeno ha funzionato sul mio server pochi minuti fa ...


4
Ma, se non sbaglio, in questo modo si grep anche ciò che è sullo schermo. Voglio vedere tutto l' output sullo schermo e filtrare solo ciò che sta andando nel file.
lorenzo-s,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.