我想在文件的每一行上顺序运行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
答案 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
。