grep -w 全匹配的问题


[root@uni191 ~]# df -h |grep -w U36-8SVC
/dev/objag             50G   11G   40G  21% /mnt/U36-8SVC
/dev/objam             50G   11G   40G  21% /mnt/U36-8SVC-0
/dev/objay             50G   11G   40G  21% /mnt/U36-8SVC-1
/dev/objbe             50G   11G   40G  21% /mnt/U36-8SVC-2
/dev/objbk             50G   11G   40G  21% /mnt/U36-8SVC-3

有如上问题,精确匹配时,不能单独匹配出 U36-8SVC,后面带了-加数字的也会匹配出来,怎么解决?

TechWhizKid参考GPT回答:

正则表达式

df -h | grep -E '(^|/)U36-8SVC($| )'



-E 标志来启用扩展的正则表达式语法。正则表达式 (^|/)U36-8SVC($| ) 匹配以 / 开头或者以空格结尾的 U36-8SVC。

这样,只有精确匹配为 U36-8SVC 的行才会被输出,而带有 -0、-1、-2、-3 的行将不会被匹配到。

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7565065
  • 这篇博客也不错, 你可以看下grep 正则表达式 如何匹配 中括号
  • 除此之外, 这篇博客: grep打印匹配行的未匹配内容中的 场景与方案 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 使用grep时,我们可以用grep <pattern>来打印出匹配行,可以使用grep -o <pattern>来打印出匹配行中的匹配内容,但是如果希望能够实现“反选”,也就是打印出匹配行中的费匹配内容,应该怎么做呢?

    单纯的grep命令没有提供这种机制的支持,但是同时使用grepsed命令就可以实现

    > echo "matched not\nmat" | grep "matched" | sed "s/matched//g"
     not
    

    首先,我们使用grep <pattern>打印出匹配行,而后,使用sed "s/<pattern>//g"将匹配行中的匹配内容替换为空字符串,就消除了匹配内容,留下了非匹配内容

  • 以下回答由chatgpt基于相关博客总结生成:

    首先使用grep -w进行精确匹配,然后使用grep -v过滤掉类似于U36-8SVC-xxx的字符串,具体步骤如下:

    grep -wn -v 'U36-8SVC-.*' file.txt
    
    • grep:命令名称
    • -w:精确匹配
    • -n:输出匹配行号
    • -v:反向选择,过滤掉匹配的行
    • 'U36-8SVC-.*':正则表达式,匹配类似于U36-8SVC-xxx的字符串
    • file.txt:需要匹配的文件名

    以上命令将匹配file.txt中所有精确匹配但不包含类似于U36-8SVC-xxx字符串的行,输出匹配行的行号和内容。