17

I recently decided that enough was enough -- I was going to learn to use grep fluently. It's been all of three hours and I'm already stumped by this toy problem.

I'm currently syncing a RAID5 array, the progress of which can be monitored by reading /proc/mdstat. The output of cat /proc/mdstat is shown below.

$ 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>

For fun, I thought I would use watch to monitor /proc/mdstat in real time, pipe it's output into grep, and show only the estimated remaining time.

My approach is as follows:

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

I'm stumped as to why this produced no output. In fact, the first grep expression produces no output, even though it seems to work on Regex101.

What am I doing wrong?

3 Answers3

27

If you want to use Perl regex syntax you need -P switch with grep. Check out previously asked guestion here Is grep syntax different from regex?

Zanna
  • 70,465
kenn
  • 5,162
13
  • You should quote your expression so the shell doesn't interpret it
  • grep doesn't have the \d escape, you'll need to use [0-9] instead.
  • + needs to be escaped without the -E switch.

This should work:

watch cat /proc/mdstat | grep 'finish=[0-9]\+\.[0-9]' | grep '[0-9]\+\.[0-9]'
kiri
  • 28,246
  • 16
  • 81
  • 118
  • 4
    @blz The grep supports 3 'styles' of regular expressions: "basic" -G (default), "extended" -E and "perl" -P. The basic mode requires that ?, +, {, |, (, and ) be escaped to have special meaning. – kiri Jan 18 '14 at 20:36
0

Use sed instead, this worked for me:

watch "cat /proc/mdstat | grep 'finish\=' | sed -e 's/.*finish\=\([0-9,\.]*\).*/\1/g'"
chaos
  • 27,506
  • 12
  • 74
  • 77