如果整行匹配,如何使grep只匹配?

我有这些:

$ cat a.tmp ABB.log ABB.log.122 ABB.log.123 

我想findABB.log的完全匹配。

但是当我做到了

 $ grep -w ABB.log a.tmp ABB.log ABB.log.122 ABB.log.123 

它显示了所有这些。

我能用grep得到我想要的吗?

只需指定锚点。

 grep '^AAA\.log$' a.tmp 
 grep -Fx ABB.log a.tmp 

从grep手册页:

-F, – 固定的string
将PATTERN解释为固定string(的列表)
-x,–line-regexp
只select完全匹配整行的匹配项。

这是我做的,尽pipe使用锚是最好的方法:

 grep -w "ABB.log " a.tmp 

与awk类似

  awk '/^ABB\.log$/' file 

如果只有一个前导空格或尾随空格,那么大多数build议都会失败,如果正在手动编辑该文件,这将会很重要。 这样会使它在这种情况下不易受影响:

 grep '^[[:blank:]]*ABB\.log[[:blank:]]*$' a.tmp 

在shell中的一个简单的while-read循环会隐式地做到这一点:

 while read file do case $file in (ABB.log) printf "%s\n" "$file" esac done < a.tmp 

当试图做类似的事情时,这对我很好:

 grep -F ABB.log a.tmp 
  $ cat venky ABB.log ABB.log.122 ABB.log.123 $ cat venky | grep "ABB.log" | grep -v "ABB.log\." ABB.log $ $ cat venky | grep "ABB.log.122" | grep -v "ABB.log.122\." ABB.log.122 $ 

我打算为OP和其他答案的尝试添加一些额外的解释。

您也可以使用John Kugelmans的解决scheme :

 grep -x "ABB\.log" a.tmp 

引用string并转义点( . )使其不再需要-F标志。

你需要逃避. (点)(因为它匹配任何字符(不只是. )如果没有转义)或使用-F标志与grep。 -F标志使它成为一个固定的string(不是正则expression式)。

如果不引用string,则可能需要双反斜杠来转义点( . ):

 grep -x ABB\\.log a.tmp 

testing:

 $ echo "ABBElog"|grep -x ABB.log ABBElog #matched !!! $ echo "ABBElog"|grep -x "ABB\.log" #returns empty string, no match 

注意:

  1. -x力量匹配整条线。
  2. 使用非转义的答案. 没有-F标志是错误的。
  3. 您可以通过用^$包装模式string来避免-x切换。 在这种情况下,请确保您不使用-F ,而是转义. ,因为-F将阻止^$的正则expression式解释。

编辑:(关于@哈克添加额外的解释):

如果你想匹配以-开头的string,那么你应该使用grep。 无论如何--将被视为input(而不是选项)。

例:

 echo -f |grep -- "-f" # where grep "-f" will show error echo -f |grep -F -- "-f" # whre grep -F "-f" will show error grep "pat" -- "-file" # grep "pat" "-file" won't work. -file is the filename 

适用于我

 grep "\bsearch_word\b" text_file > output.txt ## \b indicates/sets boundaries. # Seems to work pretty fast 

这是与HPUX,如果文件的内容之间有单词之间的空间,使用这个:

egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp

我需要这个function,但也想确保在ABB.log之前我没有返回带有前缀的行:

  • ABB.log
  • ABB.log.122
  • ABB.log.123
  • 123ABB.log

    grep“\ WABB.log $”-w a.tmp

我更喜欢:

 str="ABB.log"; grep -E "^${str}$" a.tmp 

干杯