Warum funktioniert mein grep + regex nicht?


9

Ich habe kürzlich entschieden, dass genug genug ist - ich würde lernen, grep fließend zu verwenden. Es sind alle drei Stunden vergangen und ich bin bereits verblüfft über dieses Spielzeugproblem.

Ich synchronisiere derzeit ein RAID5-Array, dessen Fortschritt durch Lesen überwacht werden kann /proc/mdstat. Die Ausgabe von cat /proc/mdstatist unten gezeigt.

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

Zum Spaß dachte ich, ich würde verwenden watch, um /proc/mdstatin Echtzeit zu überwachen , die Ausgabe in grep weiterzuleiten und nur die geschätzte verbleibende Zeit anzuzeigen.

Mein Ansatz ist wie folgt:

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

Ich bin ratlos, warum dies keine Ausgabe hervorbrachte. Tatsächlich erzeugt der erste grep-Ausdruck keine Ausgabe, obwohl er auf Regex101 zu funktionieren scheint .

Was mache ich falsch?


Sie können keinen \dregulären Ausdruck verwenden und immer zitieren grep. Siehe Syntax für reguläre Ausdrücke 'grep' .
Radu Rădeanu

Antworten:


19

Wenn Sie die Regex-Syntax verwenden möchten, benötigen Sie den Schalter -P mit grep. Schauen Sie sich den zuvor gestellten Gast hier an. Unterscheidet sich die Grep- Syntax von Regex?


Tolle Antwort - prägnant, genau und mit zusätzlichen Referenzen zum Booten! Vielen Dank!
Blz

6
  • Sie sollten Ihren Ausdruck zitieren, damit die Shell ihn nicht interpretiert
  • grephat nicht die \dFlucht, müssen Sie [0-9]stattdessen verwenden.
  • +muss ohne den -ESchalter entkommen .

Das sollte funktionieren:

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

Ich habe Kenns Antwort akzeptiert, weil -Pich mit dem Schalter Regexes auf eine Weise verwenden kann, mit der ich mich bereits recht wohl fühle. Ich stimme Ihrer Antwort jedoch immer noch zu, weil es eine gute Lösung ist. Ich werde das im Hinterkopf behalten! Vielen Dank!
Blz

3
@blz Der grep unterstützt 3 'Stile' regulärer Ausdrücke: "basic" -G (Standard), "extended" -E und "perl" -P. Der Grundmodus erfordert, ?, +, {, |, (, and )dass Escapezeichen eine besondere Bedeutung haben.
Kiri

0

Verwenden Sie sedstattdessen, das hat bei mir funktioniert:

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

Das OP möchte "lernen, grep fließend zu verwenden ".
Radu Rădeanu

@chaos, wusste nicht über sed. Ich mache mir eine mentale Notiz darüber =)
blz
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.