Shell 如果整行匹配,如何使grep仅匹配?
我有:Shell 如果整行匹配,如何使grep仅匹配?,shell,unix,grep,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获得我想要的吗?只需指定regexp锚 grep '^ABB\.log$' a.tmp 从grep手册页: -F,--固定字符串 将模式解释为固定字符串的(列表) -x,--line regex
$ 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获得我想要的吗?只需指定regexp锚
grep '^ABB\.log$' a.tmp
从grep手册页:
-F,--固定字符串
将模式解释为固定字符串的(列表)-x,--line regexp
仅选择与整行完全匹配的匹配项 与awk类似
awk '/^ABB\.log$/' file
以下是我所做的,尽管使用锚是最好的方式:
grep -w "ABB.log " a.tmp
我需要此功能,但也希望确保我没有返回在ABB.log之前带有前缀的行:
- ABB.log
- ABB.log.122
- ABB.log.123
- 123ABB.log
如果只有一个前导或尾随空格,大多数建议都会失败,如果手动编辑文件,这将很重要。这将使其在这种情况下更不易受影响:
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
读取文件时
做
案例$file in
(ABB.log)printf“%s\n”“文件”
以撒
完成
我更喜欢:
str="ABB.log"; grep -E "^${str}$" a.tmp
干杯这是HPUX,如果文件内容在单词之间有空格,请使用以下命令:
egrep”[[:space:][]ABC\.log[:space:][]a.tmp
我打算添加一些关于OP尝试和其他答案的额外解释
您也可以这样使用:
grep -x "ABB\.log" a.tmp
引用字符串并转义点(
)使其不再需要-F
标志
您需要转义
(点)(因为它匹配任何字符(不仅是
),如果没有转义),或者将-F
标志与grep一起使用-F
标志使其成为固定字符串(不是正则表达式)
如果不引用字符串,可能需要双反斜杠来转义点(
):
测试:
注:
-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
当我尝试做类似的事情时,这对我很有效:
grep -F ABB.log a.tmp
对我有用:
grep "\bsearch_word\b" text_file > output.txt
\b
指示/设置边界
似乎工作得很快很遗憾,我们无法使用-F。@Johnyy No
-F
?你在Solaris上吗?如果是这样,请使用/usr/xpg4/bin/grep
我在bash脚本中使用grep
,此选项比使用公认答案中建议的正则表达式要好。因为我正在搜索的变量中有一些特殊字符(如
),使用命令时不必转义它们。最好回答IMO,因为它允许特殊字符而不转义。这更好,因为它也适用于变量。需要两个锚(^和$),很好!如果我使用正则表达式来匹配文件?“grep-f patterns a.tmp”?@green69晚了几年,但您可以在将模式传递给grep之前使用sed添加锚定:sed-r“s/^(.*)/^-/^\1$/”patterns.txt | egrep-f-a.tmp
这也将匹配以ABB.log结尾的文件,并且应该转义点。像这样。。它将返回第一行匹配。这需要在ABB.log
之后留一个空格,这不是一般情况,即大多数情况下它都会失败。您是否实际体验到在您的情况下缺少-F?如果是这样的话,你能说说是哪种情况吗?@hakre你把我的答案看完了吗?我(非常清楚地)解释了如果
正确转义,为什么不需要-F
。当然。当然,我只是问:当你写这篇文章时,-F
可用吗?如果没有,您使用的是哪种系统?到目前为止,我在你的答案中找不到这些信息,即使是现在,当我再次阅读时也是如此。所以我真的很确定,我把你的答案完整地读了至少两遍@当然,hakre-F
是可用的。(我确实说过:“或者使用-F
标志和grep
”)谢谢你的见解。只剩下一个小问题:如果答案是-F
,为什么还要费心逃跑呢?您对此有何看法?这将匹配ABBxlog
OP希望匹配整行,而不是行中的空格分隔词。这将仅在满足前导\W
的条件下匹配,即任何非空白字符,所以xABBxlog
。这也匹配任何包含search\u word
并由单词边界分隔的行。例如,它将匹配行“foo search\u word bar”。
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
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