bash在文件的每一行上执行多个greps

时间:2014-07-28 15:18:22

标签: bash file loops grep

我想在文件的每一行上顺序运行2个不同的greps,以便按照输入文件中的顺序输出匹配项。我有一个名为temp.txt的简单文件,我将在本例中使用它。该文件的内容是:

$ cat temp.txt
line1 a
line2 b
line3 c

我有以下代码,我通过使用echo而不是第一个grep简化了这些代码。

#! /bin/bash

cat temp.txt | while read line
do
  echo $line
  grep b $line
done

我认为输出会是:

line1 a
line2 b
line2 b
line2 c

但我得到以下输出:

$ ./debug.sh
line1 a
grep: line1: No such file or directory
grep: a: No such file or directory
line2 b
grep: line2: No such file or directory
grep: b: No such file or directory
line3 c
grep: line3: No such file or directory
grep: c: No such file or directory

3 个答案:

答案 0 :(得分:2)

也许你应该只运行一个grep,但要给它两种模式来寻找:

grep 'pattern1\|pattern2' file.txt

答案 1 :(得分:1)

您必须执行以下操作:

#! /bin/bash

while read line
do
  echo "$line" | grep "b"
done < temp.txt

或者代替echo "$line" | grep "b",您也可以使用:

grep "b" <<< "$line"

在你的情况下,

grep b $line

正在尝试grep b名为$line的文件,这显然不存在。

请注意,cat while不需要while read ... done < file文件和管道。

答案 2 :(得分:0)

您的脚本应如下所示

#! /bin/bash

cat temp.txt | while read line
do
  echo $line
  grep b <<< "$line"
done

获取您想要的输出。 grep期待来自文件或来自stdin的输入。您的语法使grep认为必须打开文件。此版本可确保将$line投放到其stdin