在Bash的if语句中使用2个单词

时间:2015-03-06 17:23:58

标签: linux bash shell unix

我试图查看我的nohup文件是否包含我要查找的单词。如果是,那么我需要把它放到tmp文件中。

所以我目前正在使用:

if  grep -q "Started|missing" $DIR3/$dirName/nohup.out
then
  grep -E "Started|missing" "$DIR3/$dirName/nohup.out" > tmp
fi

但即使有我想要的单词,它也永远不会进入if语句。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

由于基本sed使用BRE,因此正则表达式交替运算符由\|表示。 |与文字|符号相匹配。而且您无需触及使用|的grep中的ERE符号。

if grep -q "Started\|missing" $DIR3/$dirName/nohup.out

答案 1 :(得分:1)

您应该使用egrep代替grep(Avinash Raj已经在他的回答中解释过了)。

我通常建议使用egrep作为日常使用的默认设置(即使许多表达式只包含基本的正则表达式语法)。从实际角度来看,标准grep仅出于性能原因而感兴趣。

有关grepegrep的优势的详细信息,请参见superuser question

答案 2 :(得分:0)

当你只将grep结果放入tmp文件时,你不想两次grep文件。
你不能使用

egrep "Started|missing" $DIR3/$dirName/nohup.out > tmp

因为在没有找到任何内容时会创建一个空的tmp文件。 您可以使用if [ ! -s tmp ]删除空文件或使用其他解决方案:

重新定位grep结果而不再使用grepping可以使用

完成
rm -f tmp 2>/dev/null
egrep "Started|missing" $DIR3/$dirName/nohup.out | while read -r strange_line; do
   echo "${strange_line}" >> tmp
done