正则表达式:如何匹配" sda"但不是" sdaa"?

时间:2017-08-02 09:57:56

标签: regex linux grep

我正在过滤lsblk -r输出以列出不是 sda的驱动器。我不会列出sdab,sdac等驱动器。

我以前的目的是:

lsblk -r | grep -o '^[a-z]*' | grep -v sda | grep -v sr | sort | uniq

返回了一个不是sda而不是sr的驱动器列表,但是当驱动器名称超出sdz时它会失败,因为grep匹配sdaa for sda并清除它。

我尝试在我的grep模式中包含一个空格无效。

我用于测试的示例(假)lsblk -r输出:

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 2,7T 0 disk 
sda1 8:1 0 14,9G 0 part [SWAP]
sda2 8:2 0 93,1G 0 part /
sda3 8:3 0 984,6G 0 part /data
sda4 8:4 0 725,4G 0 part /media/backup
sda5 8:5 0 16M 0 part 
sda6 8:6 0 498G 0 part /home
sda7 8:7 0 478,5G 0 part 
sdc 8:32 1 7,5G 0 disk 
sdd 8:48 1 7,5G 0 disk 
sde 8:64 1 7,5G 0 disk 
sdf 8:80 1 7,5G 0 disk 
sdg 8:96 1 7,5G 0 disk 
sdh 8:112 1 7,5G 0 disk 
sdi 8:128 1 7,5G 0 disk 
sdj 8:144 1 7,5G 0 disk 
sdl 8:176 1 7,5G 0 disk 
sdab 8:144 1 7,5G 0 disk 
sdac 8:176 1 7,5G 0 disk 
sdad 8:144 1 7,5G 0 disk 
sdaz 8:176 1 7,5G 0 disk 
sdab1 8:144 1 7,5G 0 part 
sdac1 8:176 1 7,5G 0 part 
sdad1 8:144 1 7,5G 0 part 
sdaz1 8:176 1 7,5G 0 part

7 个答案:

答案 0 :(得分:1)

使用单词边界:

grep -v 'sda\b'

答案 1 :(得分:0)

使用awk您可以执行纯字符串比较并避免多个grep命令:

lsblk -r | awk '$1 != "sda" && $1 != "sr" { print $1 }' | sort -u

答案 2 :(得分:0)

在PCRE正则表达式中使用负向前瞻:

grep -P '^sda(?!a)'

答案 3 :(得分:0)

您可以锚定匹配项以搜索确切的字符串:

... | grep -v '^sda$' | grep -v '^sr$' | ...

答案 4 :(得分:0)

你可以在Perl中完成整个事情:

lsblk -r | perl -lne '($d) = /^([a-z]*)/; $h{$d}++ unless $d =~ /^(sda|dr)$/; END { print for sort keys %h }'

答案 5 :(得分:0)

你需要摆脱sda吧?

sed -n '/sda[^ ]/p'

忽略sdasr

sed -n '/\(sda[^ ]\|sr\)/p'

给定输入的输出

sda1 8:1 0 14,9G 0 part [SWAP]
sda2 8:2 0 93,1G 0 part /
sda3 8:3 0 984,6G 0 part /data
sda4 8:4 0 725,4G 0 part /media/backup
sda5 8:5 0 16M 0 part 
sda6 8:6 0 498G 0 part /home
sda7 8:7 0 478,5G 0 part 
sdab 8:144 1 7,5G 0 disk 
sdac 8:176 1 7,5G 0 disk 
sdad 8:144 1 7,5G 0 disk 
sdaz 8:176 1 7,5G 0 disk 
sdab1 8:144 1 7,5G 0 part 
sdac1 8:176 1 7,5G 0 part 
sdad1 8:144 1 7,5G 0 part 
sdaz1 8:176 1 7,5G 0 part

答案 6 :(得分:0)

lsblk -r | grep disk | grep -v 'sda ' | grep -v sr | cut -d' ' -f1

它只会过滤来自lsblk -r输出的磁盘条目,然后排除' sda'然后' sr'。如果您先执行sort | uniq,则无需grep disk

示例输入的示例输出:

sdc
sdd
sde
sdf
sdg
sdh
sdi
sdj
sdl
sdab
sdac
sdad
sdaz