尝试对保存在从文件中读取的变量中的不匹配模式进行grep

时间:2018-07-13 23:49:34

标签: linux bash grep

我正在编写的脚本试图grep出不匹配的模式,其中模式作为bash变量提供给grep函数。现在,变量现在仅包含一个模式'tmp $',用于grep输出以tmp结尾的记录。 这是它的代码

 cat file | grep -v -F "${EXCLUSIONS}" 

其中EXCLUSIONS是变量

 cat file:
 /bin/xyz
 /bin/abc
 /tmp/dir/abc
 /helloworld/tmp

 echo $EXCLUSIONS:
 tmp$
 /bin

#Here I want the output to be only /tmp/dir/abc as one pattern\
#to exclude is anything that ends with tmp or /bin

输出仍然包含以tmp结尾的条目,我认为这是因为它不认为 tmp $ 结尾的 $ 为正则表达式模式。 bash中是否有一种方法可以实现此工作,在这里我可以使用像EXCLUSION这样的变量,该变量既可以包含普通模式,也可以包含带有$或^等元字符的模式以用作正则表达式?

2 个答案:

答案 0 :(得分:0)

在模棱两可的文件中搜索文本时,请停止使用单词pattern-始终使用stringregexp,无论您是什么意思。要在文件中搜索字符串,是:

grep -F 'string' file

并搜索(BRE)正则表达式为:

grep 'regexp' file

由于您希望将$末尾的tmp$视为end-of-string正则表达式元字符,因此必须在正则表达式上进行匹配,然后使用:

grep -v "$EXCLUSIONS" file

顺便说一句,为避免与已经导出并存在于环境中的其他变量名冲突,除非导出了变量,否则不要使用所有大写的变量名。

答案 1 :(得分:-1)

我认为您不应该使用-F,这意味着“固定字符串”并且不支持Regex。 并且EXCLUSIONS不应以$结尾。您应该使用$来指定grep中的行尾。 看这个例子。

cat test.txt
row1
row2
row3
1tmp
2tmp
tmp1
tmp2


echo $EXCLUSIONS
tmp

cat test.txt | grep -v ${EXCLUSIONS}$
row1
row2
row3
tmp1
tmp2

我希望它会有用。