Sortie vers stdout et en même temps grep dans un fichier

18

J'ai un script qui produit du texte stdout. Je veux voir toute cette sortie dans mon terminal, et en même temps, je veux filtrer certaines lignes et les enregistrer dans un fichier. Exemple:

$ myscript
Line A
Line B
Line C

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

$ cat out.file
Line A
Line C

Je veux voir la sortie de la première commande dans le terminal et enregistrer la sortie de la deuxième commande dans un fichier. À la fois. J'ai essayé d'utiliser tee, mais sans résultat, ou mieux, avec un résultat inversé .

lorenzo-s
la source

Réponses:

27

Je veux voir la sortie de la première commande dans le terminal et enregistrer la sortie de la deuxième commande dans un fichier.

Tant que vous ne vous souciez pas de savoir si ce que vous regardez provient de stdout ou stderr , vous pouvez toujours utiliser tee:

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

Fonctionnera sur Linux; Je ne sais pas si "/ dev / stderr" est également applicable sur d'autres * nixes.

boucle d'or
la source
9
/dev/stderrest commun. /dev/tty(signifiant le terminal actuel) fonctionnerait également ici, et c'est standard .
Gilles 'SO- arrête d'être méchant'
@ Gilles: Merveilleux. tee /dev/ttya merveilleusement servi pour mon exigence d'avoir à imprimer le stdoutscript sur le terminal et à le rediriger vers la stdincommande aussi! Merci! :-)
jamadagni
8
{ ... | tee /dev/fd/3 | grep -e A -e C > out.file; } 3>&1

Ou avec substitution de processus (ksh93, zsh ou bash):

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

Avec zsh:

... >&1 > >(grep -e A -e C > out.file)
Stéphane Chazelas
la source
J'ai trouvé que je devais utiliser le premier car il préserve le code de sortie de grep. De plus, si pour une raison quelconque vous ne pouvez pas accéder au système de fichiers / dev, il /dev/fd/3peut être remplacé par>(cat 1>&3)
golvok
4

Voici une autre façon avec sed:

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

Par défaut, sedimprime chaque ligne, dans ce cas, stdout sera le même que stdin (c'est-à-dire que vous verrez la sortie entière de myscriptsur écran).
De plus, toutes les lignes correspondantes PATTERNseront wécritesout.file

don_crissti
la source
-1

vous n'avez pas spécifié comment vous avez utilisé la commande tee mais cela devrait fonctionner:

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

au moins cela a fonctionné sur mon serveur il y a quelques minutes ...

MelBurslan
la source
4
Mais, si je ne me trompe pas, de cette façon vous grep aussi ce qui est à l' écran. Je veux voir toutes les sorties à l'écran et filtrer uniquement ce qui se passe dans le fichier.
lorenzo-s