Dlaczego mój grep + regex nie działa?


10

Niedawno zdecydowałem, że wystarczy - nauczyłem się płynnie używać grep. Minęły wszystkie trzy godziny, a problem z zabawkami już mnie zaskoczył.

Obecnie synchronizuję macierz RAID5, której postęp można monitorować poprzez czytanie /proc/mdstat. Dane wyjściowe cat /proc/mdstatpokazano poniżej.

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

Dla zabawy pomyślałem, że użyję watchdo monitorowania /proc/mdstatw czasie rzeczywistym, przesyłania danych wyjściowych do grep i wyświetlania tylko szacowanego pozostałego czasu.

Moje podejście jest następujące:

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

Jestem zszokowany, dlaczego nie przyniosło to żadnych rezultatów. W rzeczywistości pierwsze wyrażenie grep nie generuje danych wyjściowych, nawet jeśli wydaje się działać na Regex101 .

Co ja robię źle?


Nie możesz używać \di zawsze cytować wyrażenia regularnego w środku grep. Zobacz składnię wyrażeń regularnych „grep” .
Radu Rădeanu

Odpowiedzi:


20

Jeśli chcesz użyć składni wyrażenia regularnego, potrzebujesz przełącznika -P z grep. Sprawdź wcześniej zadany gość tutaj Czy składnia grep różni się od regex?


Świetna odpowiedź - zwięzła, dokładna i z dodatkowymi odniesieniami do bootowania! Dziękuję Ci!
blz

6
  • Powinieneś zacytować swoje wyrażenie, aby powłoka go nie interpretowała
  • grepnie ma \ducieczki, musisz [0-9]zamiast tego użyć .
  • +trzeba uciec bez -Eprzełącznika.

To powinno działać:

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

Zaakceptowałem odpowiedź Kenna, ponieważ -Pprzełącznik pozwoli mi używać wyrażeń regularnych w sposób, który już mi odpowiada. Nadal jednak głosuję na twoją odpowiedź, ponieważ to miłe rozwiązanie. Będę o tym pamiętać! Dzięki!
blz

3
@blz Grep obsługuje 3 „style” wyrażeń regularnych: „podstawowy” -G (domyślnie), „rozszerzony” -E i „perl” -P. Tryb podstawowy wymaga, ?, +, {, |, (, and )aby zmiany znaczenia miały specjalne znaczenie.
kiri

0

Użyj sedzamiast tego, działało to dla mnie:

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

OP chce „nauczyć się płynnie używać grep ”.
Radu Rădeanu

@chaos, Nie wiedziałem o sed. Odnotowuję to w
pamięci
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.