GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Reguläre Ausdrücke im Grep-Befehl mit 10 Beispielen – Teil I

Reguläre Ausdrücke werden verwendet, um den Text basierend auf den Mustern zu suchen und zu manipulieren. Die meisten Linux-Befehle und -Programmiersprachen verwenden reguläre Ausdrücke.

Der Grep-Befehl wird verwendet, um nach einer bestimmten Zeichenfolge in einer Datei zu suchen. Bitte lesen Sie unseren früheren Artikel für 15 praktische grep-Befehlsbeispiele.

Sie können auch reguläre Ausdrücke mit dem Befehl grep verwenden, wenn Sie nach einem Text suchen möchten, der ein bestimmtes Muster enthält. Reguläre Ausdrücke suchen nach den Mustern in jeder Zeile der Datei. Es vereinfacht unseren Suchvorgang.

Dieser Artikel ist Teil einer Serie von 2 Artikeln.

Dieser Artikel in Teil 1 behandelt grep-Beispiele für einfache reguläre Ausdrücke. Der zukünftige Artikel in Teil 2 behandelt fortgeschrittene Beispiele für reguläre Ausdrücke in grep.

Nehmen wir die Datei /var/log/messages, die in unseren Beispielen verwendet wird.

Beispiel 1. Zeilenanfang ( ^ )

Im Befehl grep stimmt das Caret-Symbol ^ mit dem Ausdruck am Anfang einer Zeile überein. Im folgenden Beispiel werden alle Zeilen angezeigt, die mit dem 10. November beginnen, d. h. Alle Nachrichten, die am 10. November protokolliert wurden.

$ grep "^Nov 10" messages.1
Nov 10 01:12:55 gs123 ntpd[2241]: time reset +0.177479 s
Nov 10 01:17:17 gs123 ntpd[2241]: synchronized to LOCAL(0), stratum 10
Nov 10 01:18:49 gs123 ntpd[2241]: synchronized to 15.1.13.13, stratum 3
Nov 10 13:21:26 gs123 ntpd[2241]: time reset +0.146664 s
Nov 10 13:25:46 gs123 ntpd[2241]: synchronized to LOCAL(0), stratum 10
Nov 10 13:26:27 gs123 ntpd[2241]: synchronized to 15.1.13.13, stratum 3

Das ^ stimmt nur dann mit dem Ausdruck am Anfang einer Zeile überein, wenn es das erste Zeichen in einem regulären Ausdruck ist. ^N stimmt mit Zeile überein, die mit N beginnt.

Beispiel 2. Zeilenende ( $)

Das Zeichen $ entspricht dem Ausdruck am Ende einer Zeile. Der folgende Befehl hilft Ihnen, alle Zeilen zu erhalten, die mit dem Wort „terminating“ enden.

$ grep "terminating.$" messages
Jul 12 17:01:09 cloneme kernel: Kernel log daemon terminating.
Oct 28 06:29:54 cloneme kernel: Kernel log daemon terminating.

Aus der obigen Ausgabe können Sie erfahren, wann das gesamte Kernel-Protokoll beendet wurde. So wie ^ nur dann auf den Zeilenanfang passt, wenn es das erste Zeichen ist, passt $ nur auf das Zeilenende, wenn es das letzte Zeichen in einem regulären Ausdruck ist.

Beispiel 3. Anzahl der Leerzeilen ( ^$ )

Mit den Zeichen ^ und $ können Sie die in einer Datei verfügbaren leeren Zeilen ermitteln. „^$“ gibt eine leere Zeile an.

$ grep -c  "^$" messages anaconda.log
messages:0
anaconda.log:3

Die obigen Befehle zeigen die Anzahl der leeren Zeilen an, die in den Nachrichten und anaconda.log-Dateien verfügbar sind.

Beispiel 4. Einzelnes Zeichen (.)

Das spezielle Metazeichen „.“ (Punkt) entspricht jedem Zeichen außer dem Zeilenendezeichen. Nehmen wir die Eingabedatei mit folgendem Inhalt.

$ cat input
1. first line
2. hi hello
3. hi zello how are you
4. cello
5. aello
6. eello
7. last line

Lassen Sie uns nun nach einem Wort suchen, das ein beliebiges einzelnes Zeichen gefolgt von ello enthält. d.h. Hallo, Cello etc.,

$ grep ".ello" input
2. hi hello
3. hi zello how are you
4. cello
5. aello
6. eello

Falls Sie nach einem Wort suchen möchten, das nur 4 Zeichen hat, können Sie grep -w „…“ eingeben. wobei ein einzelner Punkt ein beliebiges einzelnes Zeichen darstellt.

Beispiel 5. Null oder mehr Vorkommen (*)

Das Sonderzeichen „*“ stimmt mit null oder mehr Vorkommen des vorherigen Zeichens überein. Beispielsweise entspricht das Muster „1*“ null oder mehr „1“.

Das folgende Beispiel sucht nach einem Muster „Kernel:*“, d. h. Kernel:und null oder mehr Vorkommen von Leerzeichen.

$ grep "kernel: *." *
messages.4:Jul 12 17:01:02 cloneme kernel: ACPI: PCI interrupt for device 0000:00:11.0 disabled
messages.4:Oct 28 06:29:49 cloneme kernel: ACPI: PM-Timer IO Port: 0x1008
messages.4:Oct 28 06:31:06 btovm871 kernel:  sda: sda1 sda2 sda3
messages.4:Oct 28 06:31:06 btovm871 kernel: sd 0:0:0:0: Attached scsi disk sda
.
.

Im obigen Beispiel entspricht es dem Kernel- und Doppelpunktsymbol, gefolgt von einer beliebigen Anzahl von Leerzeichen/kein Leerzeichen und „.“ entspricht jedem einzelnen Zeichen.

Beispiel 6. Ein oder mehrere Vorkommen (\+)

Das Sonderzeichen „\+“ entspricht einem oder mehreren Vorkommen des vorherigen Zeichens. ” \+” entspricht mindestens einem oder mehreren Leerzeichen.

Wenn kein Leerzeichen vorhanden ist, wird es nicht übereinstimmen. Das Zeichen „+“ fällt unter den erweiterten regulären Ausdruck. Sie müssen also entkommen, wenn Sie es mit dem grep-Befehl verwenden möchten.

$ cat input
hi hello
hi    hello how are you
hihello

$ grep "hi \+hello" input
hi hello
hi    hello how are you

Im obigen Beispiel entspricht das grep-Muster dem Muster „hi“, gefolgt von einem oder mehreren Leerzeichen, gefolgt von „hello“.

Wenn zwischen hi und hallo kein Leerzeichen steht, passt es nicht dazu. Das Zeichen * stimmt jedoch mit null oder mehr Vorkommen überein.

„hihello“ wird wie unten gezeigt mit * abgeglichen.

$ grep "hi *hello" input
hi hello
hi    hello how are you
hihello
$

Beispiel 7. Null oder ein Vorkommen (\?)

Das Sonderzeichen „?“ stimmt mit null oder einem Vorkommen des vorherigen Zeichens überein. "0?" entspricht einer einzelnen Null oder nichts.

$ grep "hi \?hello" input
hi hello
hihello

„hi \?hello“ entspricht hi und hallo mit einem einzelnen Leerzeichen (hi hallo) und ohne Leerzeichen (hihello).

Die Zeile, die mehr als ein Leerzeichen zwischen hi und hello enthält, wurde im obigen Befehl nicht abgeglichen.

Beispiel 8.Escapezeichen für das Sonderzeichen (\)

Wenn Sie nach Sonderzeichen (zB:* , Punkt) im Inhalt suchen möchten, müssen Sie das Sonderzeichen im regulären Ausdruck maskieren.

$ grep "127\.0\.0\.1"  /var/log/messages.4
Oct 28 06:31:10 btovm871 ntpd[2241]: Listening on interface lo, 127.0.0.1#123 Enabled

Beispiel 9. Zeichenklasse ([0-9])

Die Zeichenklasse ist nichts anderes als eine Liste von Zeichen, die in der eckigen Klammer erwähnt werden, die verwendet wird, um nur eines von mehreren Zeichen zu finden.

$ grep -B 1 "[0123456789]\+ times" /var/log/messages.4
Oct 28 06:38:35 btovm871 init: open(/dev/pts/0): No such file or directory
Oct 28 06:38:35 btovm871 last message repeated 2 times
Oct 28 06:38:38 btovm871 pcscd: winscard.c:304:SCardConnect() Reader E-Gate 0 0 Not Found
Oct 28 06:38:38 btovm871 last message repeated 3 times

Wiederholte Meldungen werden in der Meldungsprotokolldatei als „letzte Meldung n-mal wiederholt“ protokolliert. Das obige Beispiel sucht nach der Zeile, die eine beliebige Zahl (0 bis 9) gefolgt von dem Wort „times“ enthält. Wenn es übereinstimmt, wird die Zeile vor der übereinstimmenden Zeile und auch die übereinstimmende Zeile angezeigt.

Mit in der eckigen Klammer können Sie mit Bindestrich den Zeichenbereich angeben. Wie [0123456789] kann durch [0-9] dargestellt werden. Der Alphabetbereich kann auch angegeben werden, z. B. [a-z], [A-Z] usw. Der obige Befehl kann also auch als

geschrieben werden
$ grep -B 1 "[0-9]\+ times" /var/log/messages.4

Beispiel 10. Ausnahme in der Zeichenklasse

Wenn Sie nach allen Zeichen außer denen in der eckigen Klammer suchen möchten, verwenden Sie das Zeichen ^ (Caret) als erstes Zeichen nach der offenen eckigen Klammer. Das folgende Beispiel sucht nach einer Zeile, die nicht mit dem Vokalbuchstaben aus der Wörterbuchwortdatei in Linux beginnt.

$ grep -i  "^[^aeiou]" /usr/share/dict/linux.words
1080
10-point
10th
11-point
12-point
16-point
18-point
1st
2

Das erste Caret-Symbol im regulären Ausdruck steht für den Beginn der Zeile. Das Caret-Symbol innerhalb der eckigen Klammer steht jedoch für „außer“ – d. h. Übereinstimmung mit Ausnahme von allem in der eckigen Klammer.


Linux
  1. wc Linux-Befehl mit Beispielen

  2. Nohup-Befehl mit Beispielen

  3. JQ-Befehl in Linux mit Beispielen

  4. Fortgeschrittene reguläre Ausdrücke im Grep-Befehl mit 10 Beispielen – Teil II

  5. Wie verwenden Sie reguläre Ausdrücke mit dem cp-Befehl in Linux?

15 Linux-PS-Befehl mit Beispielen

Verwenden des GREP-Befehls unter Linux mit Beispielen

Das Grep-Befehls-Tutorial mit Beispielen für Anfänger

Verlaufsbefehl mit Beispielen

Grep-Befehl in Linux (mit Beispielen)

10 praktische Beispiele für Regex mit grep