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

1

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:14

2 respostas

4
watch cat /proc/mdstat | grep -oE 'finish=[[:digit:]]+\.[[:digit:]]' | grep -oE '[[:digit:]]+\.[[:digit:]]'

Se você realmente gosta do formato "\ d" em estilo perl e seu grep suporta regexes em estilo perl, então:

cat mdstat | grep -oP 'finish=\d+\.\d' | grep -oP '\d+\.\d'

onde a opção "-P" especifica expressões regulares no estilo perl.

A opção "-o" diz ao grep para mostrar apenas a parte da linha que corresponde à expressão regular. Isso é o que remove o texto indesejado e nos permite retornar apenas o tempo restante.

    
por 17.01.2014 / 22:28
0

Você pode usar:

watch cat mdstatout | grep -oP 'finish\=\d+\.\d+' | cut -d= -f2

205,7

O -o diz ao grep para enviar apenas o texto correspondente e não a linha inteira, e -P permite usar perl regex, que ativa \d .

Além disso, uso cut para extrair os dígitos em vez de outra regex.

    
por 17.01.2014 / 22:34