I have a number of lines retrieved from a file after running the grep command as follows:
var=`grep xyz abc.txt`
Let’s say I got 10 lines which consists of xyz as a result.
Now I need to process each line I got as a result of the grep command. How do I proceed for this?
This question is tagged with
~ Asked on 2013-05-01 12:19:36
One of the easy ways is not to store the output in a variable, but directly iterate over it with a while/read loop.
grep xyz abc.txt | while read -r line ; do echo "Processing $line" # your code goes here done
There are variations on this scheme depending on exactly what you're after.
If you need to change variables inside the loop (and have that change be visible outside of it), you can use process substitution as stated in fedorqui's answer:
while read -r line ; do echo "Processing $line" # your code goes here done < <(grep xyz abc.txt)
~ Answered on 2013-05-01 12:23:42
You can do the following
while read loop, that will be fed by the result of the
grep command using the so called process substitution:
while IFS= read -r result do #whatever with value $result done < <(grep "xyz" abc.txt)
This way, you don't have to store the result in a variable, but directly "inject" its output to the loop.
Note the usage of
read -r according to the recommendations in BashFAQ/001: How can I read a file (data stream, variable) line-by-line (and/or field-by-field)?:
The -r option to read prevents backslash interpretation (usually used as a backslash newline pair, to continue over multiple lines or to escape the delimiters). Without this option, any unescaped backslashes in the input will be discarded. You should almost always use the -r option with read.
In the scenario above IFS= prevents trimming of leading and trailing whitespace. Remove it if you want this effect.
Regarding the process substitution, it is explained in the bash hackers page:
Process substitution is a form of redirection where the input or output of a process (some sequence of commands) appear as a temporary file.
~ Answered on 2013-05-01 12:25:56