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

我有这些:

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

我想找到 ABB 日志的精确匹配。

But when I did

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

它显示了所有的人。

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

243112 次浏览

只需指定 regexp 锚点。

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

From the grep man page:

- F-固定字符串
将 PATTERN 解释为固定字符串(列表)
- x,—— line-regexp
只选择那些与整行完全匹配的匹配项。

与 awk 类似

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

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

grep -w "ABB.log " a.tmp

我需要这个特性,但是也想确保在 ABB.log 之前不会返回带前缀的行:

  • ABB 日志
  • ABB 日志122
  • ABB 日志123
  • 123ABB 日志

grep "\WABB.log$" -w 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
$

Most suggestions will fail if there so much as a single leading or trailing space, which would matter if the file is being edited by hand. This would make it less susceptible in that case:

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

我更喜欢:

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

干杯

This is with HPUX, if the content of the files has space between words, use this:

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

I intend to add some extra explanation regarding the attempts of OP and other answers as well.

你也可以这样使用 John Kugelmans 的解决方案:

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

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

您需要转义 .(点)(因为它匹配 任何字符(不仅仅是 .) ,如果没有转义的话)或者在 grep 中使用 -F标志。-F标志使它成为一个固定的字符串(而不是正则表达式)。

如果你不引用字符串,你可能需要双反斜杠来转义点(.) :

grep -x ABB\\.log a.tmp


测试:

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


注:

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


EDIT: (Adding extra explanation in regards of @hakre ):

如果希望匹配以 -开头的字符串,那么应该使用带 grep 的 ----之后的内容将被作为输入(不是选项)。

例如:

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 -F ABB.log a.tmp

为我工作 :

grep "\bsearch_word\b" text_file > output.txt

\b表示/设置边界。

看起来效果很快