运行grep命令后,我从文件中检索了许多行,如下所示:
var=`grep xyz abc.txt`
Run Code Online (Sandbox Code Playgroud)
假设我得到10行,其中包含xyz.
现在我需要处理由于grep命令而得到的每一行.我该如何处理?
Mat*_*Mat 245
一种简单的方法是不将输出存储在变量中,而是使用while/read循环直接迭代它.
就像是:
grep xyz abc.txt | while read -r line ; do
echo "Processing $line"
# your code goes here
done
Run Code Online (Sandbox Code Playgroud)
这个方案有不同的变化,具体取决于你所追求的.
如果你需要在循环中更改变量(并且在其外部可以看到变化),你可以使用fedorqui的答案中所述的过程替换:
while read -r line ; do
echo "Processing $line"
# your code goes here
done < <(grep xyz abc.txt)
Run Code Online (Sandbox Code Playgroud)
fed*_*qui 19
您可以执行以下while read循环,该循环将grep使用所谓的进程替换由命令的结果提供:
while IFS= read -r result
do
#whatever with value $result
done < <(grep "xyz" abc.txt)
Run Code Online (Sandbox Code Playgroud)
这样,您不必将结果存储在变量中,而是直接将其输出"注入"到循环中.
注的用法IFS=,并read -r根据BashFAQ/001的建议:我怎样才能读取一个文件(数据流,变量)行由行(和/或场逐场)?:
读取的-r选项可防止反斜杠解释(通常用作反斜杠换行符对,继续多行或转义分隔符).如果没有此选项,输入中的任何未转义的反斜杠都将被丢弃.您应该几乎总是将-r选项与read一起使用.
在上面的场景中,IFS =阻止修剪前导和尾随空格.如果您想要此效果,请将其删除.
关于进程替换,它在bash黑客页面中进行了解释:
进程替换是一种重定向形式,其中进程的输入或输出(某些命令序列)显示为临时文件.
我建议在这里使用awk而不是grep +其他东西.
awk '$0~/xyz/{ //your code goes here}' abc.txt
对于那些寻找单线的人:
grep xyz abc.txt | while read -r line; do echo "Processing $line"; done
Run Code Online (Sandbox Code Playgroud)