在while循环中使用grep

时间:2012-04-16 10:06:44

标签: shell grep

是否可以使用像这样的shell脚本来查看grep的结果:

while read line ; do
    ...
done < grep ...

任何人都可以解释为什么这不起作用?有哪些替代方案?

谢谢!

2 个答案:

答案 0 :(得分:4)

您似乎尝试使用process substitution

lines=5
while read line ; do
    let ++lines
    echo "$lines $line" # Number each line
    # Other operations on $line and $lines
done < <(grep ...)
echo "Total: $lines lines"

假设grep实际返回一些输出行,结果应如下所示:

6: foo
7: bar
Total: 7 lines

这与grep ... | while ...略有不同:在前者中,grepsubshell中运行,而在后者中,while循环在子shell中。如果你想在循环中保留一些状态,这通常只是相关的 - 在这种情况下你应该使用第一种形式。

另一方面,如果你写

lines=5
grep ... | while read line ; do
    let ++lines
    echo "$lines $line" # Number each line
    # Other operations on $line and $lines
done
echo "Total: $lines lines"

结果将是:

6: foo
7: bar
Total: 5 lines

哎哟!计数器传递给子shell(管道的第二部分),但它不会返回到父shell。

答案 1 :(得分:3)

grep是一个命令,但done < grep告诉shell使用名为grep的文件作为输入。你需要这样的东西:

grep ... | while read line ; do
    ...
done