grep的正则表达式来检测sdaa而不是sda

时间:2014-11-19 09:59:00

标签: regex linux grep

我想grep我的linux系统中的所有设备,除了/ dev / sda。

我的设备f.e。

/dev/sda   /dev/sda2  /dev/sdb    /dev/sdc  /dev/sde  /dev/sdg  /dev/sdi  /dev/sdk
/dev/sda1  /dev/sdaa  /dev/sdbb   /dev/sdd  /dev/sdf  /dev/sdh  /dev/sdj  /dev/sdl

目前我正在使用以下命令:

ls /dev/sd* | grep '\/dev\/sd[b-z]'

,它不会检测/ dev / sdaa。

我以为我可以使用这样的正则表达式:http://regexr.com/39u99 并使用-v反转grep的结果,但我也无法使其工作。

我将不胜感激任何帮助:)

编辑:

好的非常感谢大家:)到目前为止很棒的答案。 当我还要排除/ dev / sda1和/ dev / sda2等时,我想扩展我的问题。

除了/ dev / sda和/ dev / sda1 / dev / sda2 / dev / sda3等之外的所有内容。

4 个答案:

答案 0 :(得分:2)

你几乎就在那里,正则表达式会帮助你。

\/dev\/sd(a{2}|[b-z]+)


$ grep -Po '\/dev\/sd(a{2}|[b-z]+)' file.txt 
/dev/sdb
/dev/sdc
/dev/sde
/dev/sdg
/dev/sdi
/dev/sdk
/dev/sdaa
/dev/sdbb
/dev/sdd
/dev/sdf
/dev/sdh
/dev/sdj
/dev/sdl

这是regex demo

而不是正则表达式,您也可以尝试使用bash否定功能来执行此操作。

$ ls  !(sda[0-9])
sdaa  sdb  sdbb  sdc  sdd  sde  sdf  sdg  sdh  sdi  sdj  sdk  sdl

否定对于简单过滤会更有效。

答案 1 :(得分:1)

使用下面的单词边界,

ls /dev/sd* | grep -v '/dev/sda\>'

它会打印除/dev/sda1之外的所有设备名称,例如/dev/sda2/dev/sdb/dev/sda\>充当单词边界,在单词字符和非单词字符之间进行匹配。

示例:

$ ls /dev/sd*
/dev/sda   /dev/sda10  /dev/sda2  /dev/sda5  /dev/sda7  /dev/sda9
/dev/sda1  /dev/sda11  /dev/sda3  /dev/sda6  /dev/sda8  /dev/sdb
$ ls /dev/sd* | grep -v '/dev/sda\>'
/dev/sda1
/dev/sda10
/dev/sda11
/dev/sda2
/dev/sda3
/dev/sda5
/dev/sda6
/dev/sda7
/dev/sda8
/dev/sda9
/dev/sdb

如果你真的想要正则表达式解决方案,那么你可以简单地使用下面的,

grep -Po '/dev/sd(?!a\b)\S+'

DEMO

<强>更新

  

当我想要排除/ dev / sda1和/ dev / sda2等时,我想扩展我的问题。

也就是说,他不想匹配/dev/sda家庭。

grep -oP '\/dev\/sd(?!a\S*)\S+'

DEMO

答案 2 :(得分:1)

使用extglob,您可以避免grep以及使用正则表达式:

shopt -s extglob
ls /dev/sd*!(a)

这将列出除/dev/sda以外的所有文件。

答案 3 :(得分:0)

感谢所有答案!

我正在使用

ls /dev/sd* | grep -Po '\/dev\/sd(a{2}|[b-z]+)'

最适合我的需求! :)