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

时间:2011-01-17 03:53:44

标签: shell unix grep

我有这些:

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

我想找到ABB.log的完全匹配。

但是当我做的时候

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

它显示了所有这些。

我可以使用grep获得我想要的东西吗?

12 个答案:

答案 0 :(得分:131)

grep -Fx ABB.log a.tmp

从grep手册页:

  

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

答案 1 :(得分:94)

只需指定正则表达式锚点。

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

答案 2 :(得分:24)

这是我的工作,虽然使用锚是最好的方法:

grep -w "ABB.log " a.tmp

答案 3 :(得分:2)

与awk类似

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

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

你也可以这样使用John Kugelmans' solution

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

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

您需要转义.(点)(因为它匹配任何字符(不仅仅是.),如果没有转义)或使用-F国旗与grep。 -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会阻止^$的正则表达式解释
  4. <小时/> 修改 (添加关于@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
    

答案 6 :(得分:1)

当我尝试做类似的事情时,这对我很有用:

grep -F ABB.log a.tmp

答案 7 :(得分:-1)

    $ 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
    $

答案 8 :(得分:-1)

适合我

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

\b表示/设定边界。

似乎工作得非常快

答案 9 :(得分:-2)

这是HPUX,如果文件内容在单词之间有空格,请使用:

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

答案 10 :(得分:-3)

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

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

grep "\WABB.log$" -w a.tmp

答案 11 :(得分:-3)

我更喜欢:

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

欢呼声