Comment traiter chaque ligne reçue suite à la commande grep

J’ai un certain nombre de lignes extraites d’un fichier après avoir exécuté la commande grep comme suit:

var=`grep xyz abc.txt` 

Disons que j’ai 10 lignes qui consistent en xyz en conséquence.

Maintenant, je dois traiter chaque ligne obtenue grâce à la commande grep. Comment procéder pour cela?

L’une des méthodes les plus simples consiste à ne pas stocker la sortie dans une variable, mais à la parcourir directement avec 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 y a des variations sur ce schéma en fonction de ce que vous recherchez.

Si vous devez changer les variables à l’intérieur de la boucle (et que ces modifications soient visibles en dehors de celle-ci), vous pouvez utiliser la substitution de processus comme indiqué dans la réponse de fedorqui :

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

Vous pouvez faire la boucle suivante while read , qui sera alimentée par le résultat de la commande grep utilisant la soi-disant 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 directement à "injecter" sa sortie dans la boucle.


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

L'option -r à lire empêche l'interprétation de la barre oblique inverse (généralement utilisée comme paire de nouvelle ligne de barre oblique inverse, pour continuer sur plusieurs lignes ou pour échapper aux délimiteurs). Sans cette option, toute barre oblique inverse non échappée dans l’entrée sera supprimée. Vous devriez presque toujours utiliser l'option -r avec read.

Dans le scénario ci-dessus, IFS = empêche le découpage des espaces de début et de fin. Retirez-le si vous voulez cet effet.

En ce qui concerne la substitution de processus, il est expliqué dans la page bash hackers :

La substitution de processus est une forme de redirection dans laquelle l'entrée ou la sortie d'un processus (une séquence de commandes) apparaît sous la forme d'un fichier temporaire.

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

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