如何处理接收作为grep命令的结果的每一行(How to process each line rec

2019-09-01 15:10发布

我有许多运行后从文件中检索的行的grep命令如下:

var=`grep xyz abc.txt`

比方说,我得到了10线,由XYZ的结果。

现在我需要处理每一行我作为grep命令的结果。 我该如何继续这个?

Answer 1:

其中一个简单的方法是不存储在一个变量的输出,但在它直接与迭代一段时间/读循环。

就像是:

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

有上取决于你是什么后,该方案的变化。

如果你需要改变的变量循环内(和有变化的是它的外部可见的),你可以使用进程替换项记载fedorqui的回答 :

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


Answer 2:

你可以做以下while read循环,将由结果送入grep使用所谓的进程替换命令:

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

这样,您就不必结果存储在一个变量,而是直接“注入”其输出回路。


注意的使用IFS=read -r根据BashFAQ / 001的建议: 我怎样才能读取的文件(数据流,变量)行由线(和/或场逐场)? :

-r选项读取防止反斜杠解释(通常用作反斜杠换行符对,继续多行或逃脱定界符)。 如果没有这个选项,在输入任何转义反斜杠将被丢弃。 你应该总是使用与读-r选项。

另外,在上述IFS场景=防止修剪的前缘和后空格。 如果你想要这个效果将其删除。

关于进程替换,它在解释bash的黑客网页 :

进程替换是重定向的形式,其中的处理(命令的一些序列)的输入或输出显示为一个临时文件。



Answer 3:

我建议用awk代替grep的+别的东西在这里。

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



Answer 4:

通常情况下,处理的顺序并不重要。 GNU并行针对这种情况提出:

grep xyz abc.txt | parallel echo do stuff to {}

如果处理更像是:

grep xyz abc.txt | myprogram_reading_from_stdin

myprogram是缓慢的,那么你可以运行:

grep xyz abc.txt | parallel --pipe myprogram_reading_from_stdin


文章来源: How to process each line received as a result of grep command
标签: bash shell grep