48 votes

Comment fusionner les résultats de deux commandes différentes en une seule commande ?

Je souhaite fusionner (unir) les résultats de deux commandes différentes et les diriger vers une seule commande.

Un exemple stupide :

Commandes Je veux fusionner les résultats :

cat wordlist.txt
ls ~/folder/*

en :

wc -l

Dans cet exemple, si le fichier wordlist.txt contient 5 lignes et 3 fichiers, je veux que wc -l pour renvoyer 8.

$cat wordlist.txt *[magical union thing]* ls ~/folder/* | wc -l
8

Comment faire ?

72voto

djensen47 Points 1406

Votre truc magique de l'union est un point-virgule... et des accolades :

    { cat wordlist.txt ; ls ~/folder/* ; } | wc -l

Les accolades ne font que regrouper les commandes, de sorte que le signe de la pipe | affecte la production combinée.

Vous pouvez également utiliser des parenthèses () autour d'un groupe de commandes, qui exécuterait les commandes dans un sous-shell. Il existe des différences subtiles avec les accolades, par exemple, essayez ce qui suit :

    cd $HOME/Desktop ; (cd $HOME ; pwd) ; pwd
    cd $HOME/Desktop ; { cd $HOME ; pwd ; } ; pwd

Vous constaterez que toutes les variables d'environnement, y compris le répertoire de travail actuel, sont réinitialisées après la sortie du groupe des parenthèses, mais pas après la sortie du groupe des accolades.

En ce qui concerne le point-virgule, les alternatives incluent le && y || qui exécuteront conditionnellement la seconde commande seulement si la première est réussie ou si elle ne l'est pas, respectivement, par ex.

    cd $HOME/project && make
    ls $HOME/project || echo "Directory not found."

9voto

Lekensteyn Points 162346

Depuis wc accepte un chemin de fichier comme entrée, vous pouvez également utiliser la substitution de processus :

wc -l <(cat wordlist.txt; ls ~/folder/*)

Cela équivaut à peu près à :

echo wordlist.txt > temp
ls ~/folder/* >> temp
wc -l temp

Attention ls ~/folder/* renvoie également le contenu des sous-répertoires s'il y en a (en raison de l'expansion des globes). Si vous souhaitez simplement lister le contenu de ~/folder il suffit d'utiliser ls ~/folder .

3voto

Rolf Points 1420

Je me suis posé la même question, et j'ai fini par écrire un petit script.

magicalUnionThing (Je l'appelle append ):

#!/bin/sh
cat /dev/stdin
$*

Rendre ce script exécutable

chmod +x ./magicalUnionThing

Maintenant vous le faites

cat wordlist.txt |./magicalUnionThing ls ~/folder/* | wc -l

Ce qu'il fait :

  • Envoyer l'entrée standard vers la sortie standard
  • Exécuter l'argument. $* renvoie tous les arguments sous forme de chaîne de caractères. La sortie de cette commande va par défaut dans la sortie standard script.

Ainsi, le stdout de magicalUnionThing sera son stdin + le stdout de la commande passée en argument.

Il existe bien sûr des moyens plus simples, comme indiqué dans d'autres réponses.
Cette alternative peut peut-être s'avérer utile dans certains cas.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X