Come elaborare ogni riga ricevuta come risultato del comando grep

Ho un numero di righe recuperate da un file dopo aver eseguito il comando grep come segue:

var=`grep xyz abc.txt` 

Diciamo che ho ottenuto 10 linee che consistono in xyz come risultato.

Ora ho bisogno di elaborare ogni riga che ho ottenuto come risultato del comando grep. Come procedo per questo?

Uno dei modi semplici è non archiviare l’output in una variabile, ma direttamente iterare su di esso con un ciclo while / read.

Qualcosa di simile a:

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

Ci sono variazioni su questo schema a seconda esattamente quello che stai cercando.

Se è necessario modificare le variabili all’interno del ciclo (e avere tale modifica essere visibile al di fuori di esso), è ansible utilizzare la sostituzione del processo come indicato nella risposta di fedorqui :

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

È ansible eseguire quanto segue while read ciclo, che verrà alimentato dal risultato del comando grep utilizzando la cosiddetta sostituzione del processo:

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

In questo modo, non è necessario memorizzare il risultato in una variabile, ma direttamente "iniettare" l'output nel ciclo.


Notare l'uso di IFS= e read -r secondo le raccomandazioni in BashFAQ / 001: Come posso leggere un file (stream di dati, variabile) riga per riga (e / o campo per campo)? :

L'opzione -r da leggere impedisce l'interpretazione del backslash (solitamente usata come una coppia di backline backslash, per continuare su più righe o per sfuggire ai delimitatori). Senza questa opzione, tutte le barre rovesciate senza escape nell'input verranno scartate. Dovresti quasi sempre usare l'opzione -r con read.

Nello scenario sopra IFS = impedisce il taglio degli spazi bianchi iniziali e finali. Rimuovilo se vuoi questo effetto.

Per quanto riguarda la sostituzione del processo, è spiegato nella pagina degli hacker di bash :

La sostituzione del processo è una forma di reindirizzamento in cui l'input o l'output di un processo (alcune sequenze di comandi) vengono visualizzati come file temporanei.

Ti suggerirei di usare awk invece di grep + qualcos’altro qui.

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