J'ai une commande qui envoie des données à stdout (command1 -p=aaa -v=bbb -i=4
).
La ligne de sortie peut avoir la valeur suivante :
rate (10%) - name: value - 10Kbps
Je veux grep cette sortie afin de stocker ce "taux" (je suppose que le tuyau sera utile ici).
Et enfin, je voudrais que ce taux soit une valeur d'un paramètre sur une deuxième commande (disons command2 -t=${rate}
)
Cela semble être délicat de mon côté; J'aimerais mieux savoir comment utiliser pipes, grep, sed, etc.
J'ai essayé beaucoup de combinaisons comme celle-ci, mais je ne comprends pas celles-ci :
$ command1 -p=aaa -v=bbb -i=4 | grep "rate" 2>&1 command2 -t="rate was "${rate}
Réponse acceptée :
Vous confondez deux types d'entrées très différents.
- Saisie standard (
stdin
) - Arguments de la ligne de commande
Ceux-ci sont différents et sont utiles à des fins différentes. Certaines commandes peuvent recevoir des entrées dans les deux sens, mais elles les utilisent généralement différemment. Prenons par exemple le wc
commande :
-
Passer l'entrée par
stdin
:ls | wc -l
Cela comptera les lignes dans la sortie de
ls
-
Passer l'entrée par des arguments de ligne de commande :
wc -l $(ls)
Cela comptera les lignes dans la liste des fichiers imprimé par
ls
Des choses complètement différentes.
Pour répondre à votre question, il semble que vous souhaitiez capturer le taux à partir de la sortie de la première commande, puis utiliser le taux comme argument de ligne de commande pour la deuxième commande. Voici une façon de procéder :
rate=$(command1 | sed -ne 's/^rate..([0-9]*)%.*/1/p')
command2 -t "rate was $rate"
Explication du sed
:
- Les
s/pattern/replacement/
commande est de remplacer un motif - Le modèle signifie :la ligne doit commencer par "taux" (
^rate
) suivi de deux caractères (..
), suivi de 0 ou plusieurs chiffres, suivi d'un%
, suivi du reste du texte (.*
) 1
dans le remplacement signifie le contenu de la première expression capturée dans(...)
, donc dans ce cas les chiffres avant le%
signer- Le
-n
drapeau dused
commande signifie ne pas imprimer de lignes par défaut. Lep
à la fin dess///
commande signifie imprimer la ligne s'il y avait un remplacement. En bref, la commande n'imprimera quelque chose que s'il y avait une correspondance.