我有许多运行后从文件中检索的行的grep命令如下:
var=`grep xyz abc.txt`
比方说,我得到了10线,由XYZ的结果。
现在我需要处理每一行我作为grep命令的结果。 我该如何继续这个?
我有许多运行后从文件中检索的行的grep命令如下:
var=`grep xyz abc.txt`
比方说,我得到了10线,由XYZ的结果。
现在我需要处理每一行我作为grep命令的结果。 我该如何继续这个?
其中一个简单的方法是不存储在一个变量的输出,但在它直接与迭代一段时间/读循环。
就像是:
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)
你可以做以下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的黑客网页 :
进程替换是重定向的形式,其中的处理(命令的一些序列)的输入或输出显示为一个临时文件。
我建议用awk代替grep的+别的东西在这里。
awk '$0~/xyz/{ //your code goes here}' abc.txt
通常情况下,处理的顺序并不重要。 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