我有这些:
$ 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获得我想要的东西吗?
答案 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
<小时/> 注意:
-x
强制匹配整条线。.
没有-F
标志的答案是错误的。-x
和^
包装模式字符串来避免$
切换。在这种情况下,请确保您不使用-F
,而不是.
,因为-F
会阻止^
和$
的正则表达式解释<小时/> 修改强> (添加关于@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之前返回带前缀的行:
grep "\WABB.log$" -w a.tmp
答案 11 :(得分:-3)
我更喜欢:
str="ABB.log"; grep -E "^${str}$" a.tmp
欢呼声