¿Por qué mi grep + regex no funciona?

9

Recientemente decidí que ya era suficiente: iba a aprender a usar grep con fluidez. Han pasado tres horas y ya estoy perplejo por este problema con los juguetes.

Actualmente estoy sincronizando una matriz RAID5, cuyo progreso se puede monitorear leyendo /proc/mdstat. La salida de cat /proc/mdstatse muestra a continuación.

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

Por diversión, pensé que lo usaría watchpara monitorear /proc/mdstaten tiempo real, canalizar su salida a grep y mostrar solo el tiempo restante estimado.

Mi enfoque es el siguiente:

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

Estoy perplejo de por qué esto no produjo salida. De hecho, la primera expresión grep no produce salida, aunque parece funcionar en Regex101 .

¿Qué estoy haciendo mal?

blz
fuente
No puede usar \dy siempre citar una expresión regular dentro grep. Consulte la sintaxis de expresión regular 'grep' .
Radu Rădeanu

Respuestas:

6
  • Debes citar tu expresión para que el shell no la interprete
  • grepno tiene el \descape, deberás usarlo [0-9]en su lugar.
  • +necesita ser escapado sin el -Einterruptor.

Esto debería funcionar:

watch cat /proc/mdstat | grep 'finish=[0-9]\+\.[0-9]' | grep '[0-9]\+\.[0-9]'
kiri
fuente
Acepté la respuesta de Kenn porque el -Pcambio me permitirá usar expresiones regulares de una manera con la que ya me siento bastante cómodo. Sin embargo, todavía estoy votando tu respuesta porque es una buena solución. Voy a tener esto en cuenta! ¡Gracias!
blz
3
@blz El grep admite 3 'estilos' de expresiones regulares: "básico" -G (predeterminado), "extendido" -E y "perl" -P. El modo básico requiere que ?, +, {, |, (, and )se escape para tener un significado especial.
kiri
0

Use en su sedlugar, esto funcionó para mí:

watch "cat /proc/mdstat | grep 'finish\=' | sed -e 's/.*finish\=\([0-9,\.]*\).*/\1/g'"
caos
fuente
El OP quiere "aprender a usar grep con fluidez".
Radu Rădeanu
@chaos, no sabía sobre sed. Estoy haciendo una nota mental de esto =)
blz