179 votes

Comment traiter chaque ligne de sortie dans une boucle ?

J'ai un certain nombre de lignes extraites d'un fichier après l'exécution de la fonction grep comme suit :

var=`grep xyz abc.txt`

Disons que j'ai 10 lignes qui consistent en xyz comme résultat.

Maintenant, je dois traiter chaque ligne que j'ai obtenue comme résultat de la commande grep. Comment dois-je procéder pour cela ?

321voto

Mat Points 104488

L'une des méthodes les plus simples consiste à ne pas stocker la sortie dans une variable, mais à la parcourir directement à l'aide d'une boucle while/read.

Quelque chose comme :

grep xyz abc.txt | while read -r line ; do
    echo "Processing $line"
    # your code goes here
done

Il existe des variations de ce schéma en fonction de ce que vous recherchez.

Si vous devez modifier des variables à l'intérieur de la boucle (et faire en sorte que cette modification soit visible à l'extérieur de celle-ci), vous pouvez utiliser la substitution de processus comme indiqué dans la section La réponse de fedorqui :

while read -r line ; do
    echo "Processing $line"
    # your code goes here
done < <(grep xyz abc.txt)

26voto

fedorqui Points 42938

Vous pouvez faire ce qui suit while read qui sera alimentée par le résultat de la boucle grep en utilisant ce qu'on appelle la substitution de processus :

while IFS= read -r result
do
    #whatever with value $result
done < <(grep "xyz" abc.txt)

De cette façon, vous n'avez pas à stocker le résultat dans une variable, mais à "injecter" directement sa sortie dans la boucle.


Notez l'utilisation de IFS= y read -r conformément aux recommandations de BashFAQ/001 : Comment lire un fichier (flux de données, variable) ligne par ligne (et/ou champ par champ) ? :

L'option -r pour la lecture empêche l'interprétation des barres obliques inverses (habituellement utilisée comme une paire de backslashs newline, pour continuer sur plusieurs lignes ou pour échapper aux délimiteurs). Sans cette option, toutes les barres obliques inverses non masquées dans l'entrée sera éliminé. Vous devriez presque toujours utiliser l'option -r avec read.

Dans le scénario ci-dessus, IFS= empêche de couper les espaces blancs de tête et de queue. d'espacement. Supprimez-la si vous souhaitez obtenir cet effet.

En ce qui concerne la substitution de processus, elle est expliquée dans le document intitulé page des hackers bash :

La substitution de processus est une forme de redirection où l'entrée ou le d'un processus (une séquence de commandes) apparaît comme un fichier temporaire. temporaire.

14voto

this.lau_ Points 23290

Pour ceux qui cherchent une phrase à la mode :

grep xyz abc.txt | while read -r line; do echo "Processing $line"; done

9voto

Julien Grenier Points 1980

Je suggère d'utiliser awk au lieu de grep + autre chose ici.

awk '$0~/xyz/{ //your code goes here}' abc.txt

2voto

Nicolas Bonnici Points 121

Sans aucune itération avec l'option --line-buffered grep :

your_command | grep --line-buffered "your search"

Exemple concret avec une sortie de commande de débogage de routeur Symfony PHP Framework, pour récupérer toutes les routes liées à "api" :

php bin/console d:r | grep --line-buffered "api"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X