为什么我的 grep + regex 不起作用?

为什么我的 grep + regex 不起作用?

我最近决定够了——我要学会熟练使用 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监控,将它的输出导入 grep,并只显示估计的剩余时间。/proc/mdstat

我的方法如下:

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

我很困惑为什么这没有产生任何输出。事实上,第一个 grep 表达式没有产生任何输出,尽管它似乎可以工作Regex101

我究竟做错了什么?

答案1

如果您想使用 Perl 正则表达式语法,则需要-P切换到 grep。在此处查看之前提出的问题grep 语法与正则表达式不同吗?

答案2

  • 你应该引用你的表达式,这样 shell 就不会解释它
  • grep没有\d逃脱,你需要使用[0-9]
  • +需要在没有-E开关的情况下进行转义。

这应该有效:

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

答案3

sed相反,这对我有用:

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

相关内容