为什么我的grep +正则表达式不起作用?


10

我最近认为足够就够了-我将流利地学习使用grep。已经三个小时了,这个玩具问题已经困扰我了。

我目前正在同步RAID5阵列,可以通过阅读监视其进度/proc/mdstat。的输出cat /proc/mdstat如下所示。

$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : active raid5 sda4[0] sdb4[1] sdc4[2]
      5858765824 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
      [=============>.......]  resync = 67.3% (1972073120/2929382912) finish=205.7min speed=77537K/sec

md0 : active raid5 sda3[0] sdb3[1] sdc3[2]
      998400 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

为了娱乐,我认为我将用于实时watch监控/proc/mdstat,将其输出通过管道传输到grep,并仅显示估计的剩余时间。

我的方法如下:

watch cat /proc/mdstat | grep finish=\d+\.\d | grep \d+\.\d

我很困惑为什么没有产生任何输出。实际上,即使第一个grep表达式似乎在Regex101上也可以工作,但不会产生任何输出。

我究竟做错了什么?


您不能使用\d并且总是在其中引用正则表达式grep。参见'grep'正则表达式语法
RaduRădeanu2014年

Answers:



6
  • 您应该引用您的表达式,以便外壳程序不解释它
  • grep没有\d转义符,则需要使用转义[0-9]符。
  • +需要不用-E开关就可以逃脱。

这应该工作:

watch cat /proc/mdstat | grep 'finish=[0-9]\+\.[0-9]' | grep '[0-9]\+\.[0-9]'

我接受了kenn的回答,因为该-P开关将允许我以已经很熟悉的方式使用正则表达式。不过,我仍然支持您的回答,因为这是一个不错的解决方案。我会牢记这一点!谢谢!
blz 2014年

3
@blz grep支持3种“样式”正则表达式:“基本” -G(默认),“扩展” -E和“ perl” -P。基本模式要求?, +, {, |, (, and )转义具有特殊含义。
kiri 2014年

0

使用sed代替,这对我有用:

watch "cat /proc/mdstat | grep 'finish\=' | sed -e 's/.*finish\=\([0-9,\.]*\).*/\1/g'"

OP希望“学习流利地使用grep ”。
RaduRădeanu2014年

@chaos,不了解sed。我正在对此做一个心理记录=)
blz 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.