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

Lou*_*ult 13 grep

我最近决定足够了——我将学习流利地使用 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>
Run Code Online (Sandbox Code Playgroud)

为了好玩,我想我会使用实时watch监控/proc/mdstat,将它的输出通过管道传输到 grep,并仅显示估计的剩余时间。

我的方法如下:

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

我很难过为什么这没有产生任何输出。事实上,第一个 grep 表达式不会产生任何输出,即使它似乎适用于Regex101

我究竟做错了什么?

ken*_*enn 25

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


kir*_*iri 9

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

这应该有效:

watch cat /proc/mdstat | grep 'finish=[0-9]\+\.[0-9]' | grep '[0-9]\+\.[0-9]'
Run Code Online (Sandbox Code Playgroud)

  • @blz grep 支持 3 种“样式”正则表达式:“basic”-G(默认)、“extended”-E 和“perl”-P。基本模式要求将 `?, +, {, |, (, and )` 转义以具有特殊含义。 (4认同)