La sortie d'une commande peut-elle être canalisée vers deux autres commandes?


Réponses:


56

Il semble que la teecommande fera ce que vous voulez.

La clé est d'utiliser

>( )

pour la substitution de processus . Avec tee, utilisez le modèle suivant:

tee >(proc1) >(proc2) >(proc3) | proc4

Donc, si vous souhaitez utiliser la sortie de lscomme entrée pour deux grepprogrammes différents , enregistrer la sortie de chacun grepdans des fichiers différents et diriger tous les résultats less, essayez:

ls -A | tee >(grep ^[.] > hidden-files) >(grep -v ^[.] > normal-files) | less

Les résultats de la ls -Aseront «canalisés» dans les deux grepart. Le fichier hidden-filesaura le contenu de la sortie du premier grep, et normal-filesaura les résultats du second grep. Tous les fichiers seront affichés dans le pager less. EDIT : ce que vous voyez lessest la même sortie exacte de ls -A, pas le résultat du greps. Si vous souhaitez modifier la sortie de ls -Aà less(par exemple, permuter l'ordre afin que les fichiers normaux soient répertoriés avant ceux masqués), essayez ceci:

ls -A | tee >(grep ^[.]) >(grep -v ^[.]) >/dev/null | less

Sans >/dev/null, la sortie de greps serait ajoutée à la sortie de ls -Aau lieu de la remplacer.

la source


3
Celui-ci est très bon !
hayalci

3
+1 parce que même après 10 ans de scripts shell, je n'avais jamais vu ça!
jtimberman

6

Utilisez "tee".

Exemple:

grep someSearchString someFile | tee /dev/tty | wc -l > grepresult

Cela enverra la sortie de la commande grep à la fois au terminal et à wc (dont la sortie est à son tour redirigée vers le fichier grepresult).

"Tee" est expliqué dans l'article de Wikipedia tee (commande) . Central est: "La commande tee lit l'entrée standard, puis écrit son contenu sur la sortie standard et le copie simultanément dans le ou les fichiers ou variables spécifiés.".

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.