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

9

Recentemente, decidi que bastava - 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 pela leitura /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 watchpara monitorar /proc/mdstatem tempo real, canalizar sua saída para 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 quanto ao por que isso não produziu saída. De fato, a primeira expressão grep não produz saída, mesmo que pareça funcionar no Regex101 .

O que estou fazendo errado?

blz
fonte
Você não pode usar \de sempre citar uma regex dentro grep. Consulte a sintaxe da expressão regular 'grep' .
Radu Rădeanu

Respostas:

19

Se você quiser usar a sintaxe regex, precisará da opção -P com grep. Confira aqui a convidado anteriormente. A sintaxe grep é diferente da regex?

Kenn
fonte
Ótima resposta - concisa, precisa e com referências adicionais para inicializar! Obrigado!
blz
6
  • Você deve citar sua expressão para que o shell não a interprete
  • grepnão tiver \descapatória, você precisará usar [0-9].
  • +precisa ser escapado sem a -Echave.

Isso deve funcionar:

watch cat /proc/mdstat | grep 'finish=[0-9]\+\.[0-9]' | grep '[0-9]\+\.[0-9]'
kiri
fonte
Aceitei a resposta de kenn porque a -Popção permitirá que eu use expressões regulares de uma maneira com a qual já estou bastante confortável. Ainda estou votando sua resposta, no entanto, porque é uma boa solução. Vou manter isso em mente! Obrigado!
blz
3
@blz O grep suporta 3 'estilos' de expressões regulares: "basic" -G (padrão), "extended" -E e "perl" -P. O modo básico exige que o ?, +, {, |, (, and )escape tenha um significado especial.
kiri
0

Em sedvez disso, use isso funcionou para mim:

watch "cat /proc/mdstat | grep 'finish\=' | sed -e 's/.*finish\=\([0-9,\.]*\).*/\1/g'"
caos
fonte
O OP quer "aprender a usar o grep fluentemente".
Radu Rădeanu
@ Chaos, não sabia sobre sed. Estou fazendo uma nota mental deste =)
blz