Perché grep + regex non funziona?


10

Di recente ho deciso che bastava abbastanza: avrei imparato ad usare fluentemente grep. Sono passate tutte e tre le ore e sono già sconcertato da questo problema con i giocattoli.

Attualmente sto sincronizzando un array RAID5, i cui progressi possono essere monitorati leggendo /proc/mdstat. L'output di cat /proc/mdstatè mostrato di seguito.

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

Per divertimento, ho pensato che avrei usato watchper monitorare /proc/mdstatin tempo reale, reindirizzare l'output in grep e mostrare solo il tempo rimanente stimato.

Il mio approccio è il seguente:

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

Sono sconcertato sul perché questo non abbia prodotto risultati. In effetti, la prima espressione grep non produce alcun output, anche se sembra funzionare su Regex101 .

Che cosa sto facendo di sbagliato?


Non puoi usare \de citare sempre una regex all'interno grep. Vedi la sintassi dell'espressione regolare 'grep' .
Radu Rădeanu,

Risposte:



6
  • Dovresti citare la tua espressione in modo che la shell non la interpreti
  • grepnon ha la via di \dfuga, dovrai [0-9]invece usarlo .
  • +deve essere evitato senza l' -Einterruttore.

Questo dovrebbe funzionare:

watch cat /proc/mdstat | grep 'finish=[0-9]\+\.[0-9]' | grep '[0-9]\+\.[0-9]'

Ho accettato la risposta di Kenn perché lo -Pswitch mi permetterà di usare le regex in un modo con cui mi sento già abbastanza a mio agio. Sto ancora votando la tua risposta, però, perché è una bella soluzione. Lo terrò a mente! Grazie!
blz

3
@blz Il grep supporta 3 'stili' di espressioni regolari: "base" -G (impostazione predefinita), "estesa" -E e "perl" -P. La modalità di base richiede che l' ?, +, {, |, (, and )escaping abbia un significato speciale.
Kiri,

0

Usa sedinvece, questo ha funzionato per me:

watch "cat /proc/mdstat | grep 'finish\=' | sed -e 's/.*finish\=\([0-9,\.]*\).*/\1/g'"

L'OP vuole "imparare a usare grep in modo fluido".
Radu Rădeanu,

@chaos, non sapevo di sed. Sto prendendo nota di questo =)
blz il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.