我想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等之外的所有内容。
答案 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
而不是正则表达式,您也可以尝试使用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+'
<强>更新强>
当我想要排除/ dev / sda1和/ dev / sda2等时,我想扩展我的问题。
也就是说,他不想匹配/dev/sda
家庭。
grep -oP '\/dev\/sd(?!a\S*)\S+'
答案 2 :(得分:1)
答案 3 :(得分:0)
感谢所有答案!
我正在使用
ls /dev/sd* | grep -Po '\/dev\/sd(a{2}|[b-z]+)'
最适合我的需求! :)