[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,后面带了-加数字的也会匹配出来,怎么解决?
正则表达式
df -h | grep -E '(^|/)U36-8SVC($| )'
-E 标志来启用扩展的正则表达式语法。正则表达式 (^|/)U36-8SVC($| ) 匹配以 / 开头或者以空格结尾的 U36-8SVC。
这样,只有精确匹配为 U36-8SVC 的行才会被输出,而带有 -0、-1、-2、-3 的行将不会被匹配到。
使用grep
时,我们可以用grep <pattern>
来打印出匹配行,可以使用grep -o <pattern>
来打印出匹配行中的匹配内容,但是如果希望能够实现“反选”,也就是打印出匹配行中的费匹配内容,应该怎么做呢?
单纯的grep
命令没有提供这种机制的支持,但是同时使用grep
和sed
命令就可以实现
> echo "matched not\nmat" | grep "matched" | sed "s/matched//g"
not
首先,我们使用grep <pattern>
打印出匹配行,而后,使用sed "s/<pattern>//g"
将匹配行中的匹配内容替换为空字符串,就消除了匹配内容,留下了非匹配内容
首先使用grep -w进行精确匹配,然后使用grep -v过滤掉类似于U36-8SVC-xxx的字符串,具体步骤如下:
grep -wn -v 'U36-8SVC-.*' file.txt
以上命令将匹配file.txt中所有精确匹配但不包含类似于U36-8SVC-xxx字符串的行,输出匹配行的行号和内容。