Por que meu grep + regex não está funcionando?

4

Eu recentemente decidi que já era o suficiente - eu aprenderia a usar o grep fluentemente. Já faz três horas e eu já estou perplexo com esse problema de brinquedo.

Atualmente, estou sincronizando uma matriz RAID5, cujo progresso pode ser monitorado lendo /proc/mdstat . A saída de cat /proc/mdstat é mostrada abaixo.

$ 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 diversão, pensei em usar watch para monitorar /proc/mdstat em tempo real, canalizar sua saída para o grep e mostrar apenas o tempo restante estimado.

Minha abordagem é a seguinte:

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

Estou perplexo sobre por que isso não produziu saída. Na verdade, a primeira expressão grep não produz saída, mesmo que pareça funcionar em Regex101 .

O que estou fazendo de errado?

    
por blz 17.01.2014 / 22:19

3 respostas

12

Se você quiser usar a sintaxe regex, você precisa de -P switch com grep. Confira a guestion solicitada anteriormente aqui A sintaxe do grep é diferente da regex?

    
por kenn 17.01.2014 / 23:02
4
  • Você deve citar sua expressão para que o shell não a interprete
  • grep não tem o escape \d , você precisará usar [0-9] .
  • + precisa ser escapado sem a opção -E .

Isso deve funcionar:

watch cat /proc/mdstat | grep 'finish=[0-9]\+\.[0-9]' | grep '[0-9]\+\.[0-9]'
    
por kiri 17.01.2014 / 22:26
0

Use sed , isso funcionou para mim:

watch "cat /proc/mdstat | grep 'finish\=' | sed -e 's/.*finish\=\([0-9,\.]*\).*//g'"
    
por chaos 17.01.2014 / 22:35

Tags