grep 不匹配确切的字符串

时间:2021-06-21 16:50:18

标签: grep

我对 grep 的行为不符合预期感到有些困扰。 我试图从一种字典中提取主机,结构类似于 OLD_HOST_NAME;NEW_HOST_NAME,其中一些具有相同的前缀,例如“HOST-1-2”。 我只想匹配“HOST-1-2”,但与我传递给 grep 的选项无关,它会不断返回具有相同前缀的所有字符串,而不是仅匹配确切的字符串,即:

grep -F "HOST-1-2" dict.txt
HOST-1-2-3;NEW_HOST-1-2-3
HOST-1-2-4;NEW_HOST-1-2-4
HOST-1-2-5;NEW_HOST-1-2-5

我尝试了几个选项,例如 grep -w "HOST-1-2"grep -e '\HOST-1-2\b'grep -e '\HOST-1-2\b'grep -Po "\bHOST-1-2\b"(实际上与我想要的匹配,但它对所有出现的子字符串都这样做所以它仍然不起作用),尝试混合它们,但在一天结束时我仍然没有得到我需要的东西。

知道如何实现我想要的,以便在没有所有其他部分匹配的情况下只搜索“HOST-1-2”吗?

编辑: 抱歉没有更清楚地指定,字典示例是我已经显示的错误子字符串匹配 crep 的结果:

old_host;new_host
SERVER-1;NEW_SERVER-1
HOST-1-2-3;NEW_HOST-1-2-3
HOST-1-2-4;NEW_HOST-1-2-4
HOST-1-2-5;NEW_HOST-1-2-5

我已经说明了我想要实现的目标:

<块引用>

为了只对“HOST-1-2”进行 grepping 而没有所有其他部分 匹配

2 个答案:

答案 0 :(得分:1)

您可以使用此grep

grep -E '(^|;)HOST-1-2(;|$)' file

这意味着:

  • -E:启用扩展正则表达式模式
  • (^|;):匹配开始或;
  • HOST-1-2:匹配HOST-1-2
  • (;|$):匹配 ; 或结束

答案 1 :(得分:1)

您可以使用 grep -o 仅打印行的匹配部分,并在 2 之后和 H 之前添加单词边界

grep -o '\<HOST-1-2\>' ./dict.txt

输出

HOST-1-2
HOST-1-2
HOST-1-2

如果您只想打印第一个匹配项:

grep -oP '^.*?\b\KHOST-1-2\b' ./dict.txt