如何处理由于grep命令而收到的每一行

运行grep命令之后,我从文件中检索了许多行,如下所示:

var=`grep xyz abc.txt` 

比方说,我得到了10个由xyz组成的行。

现在我需要处理grep命令的结果。 我如何继续?

其中一个简单的方法是不将输出存储在一个variables中,而是直接用while / read循环遍历它。

就像是:

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

这个scheme有各种各样的取决于你究竟是什么。

如果您需要更改循环内部的variables(并且可以在外部更改variables),则可以使用fedorqui答案中所述的过程replace:

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

while read循环时可以执行以下操作, grep命令的结果将使用所谓的进程replace:

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

这样,您不必将结果存储在variables中,而是直接将其输出“注入”到循环中。


请注意,根据BashFAQ / 001中的build议,使用IFS=read -r : 如何逐行读取文件(数据stream,variables)(和/或逐字段)? :

读取的-r选项可防止反斜杠解释(通常用作反斜线换行符,继续多行或转义分隔符)。 没有这个选项,input中的任何非反转的反斜杠将被丢弃。 你应该几乎总是使用阅读-r选项。

在上面的情况下IFS =防止前导和尾随空白的修剪。 删除它,如果你想要这个效果。

关于进程replace,在bash黑客页面中解释:

进程replace是一种redirectforms,其中进程的input或输出(某些命令序列)显示为临时文件。

我会build议在这里使用awk而不是grep +别的东西。

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