Why is my grep + regex not working?
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?
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?
- 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]'