如果整行匹配,如何使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
注意:
-
-x
力量匹配整条线。 - 使用非转义的答案
.
没有-F
标志是错误的。 - 您可以通过用
^
和$
包装模式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
干杯