Grep-Ausdruck zum Suchen einer Zahl

Grep-Ausdruck zum Suchen einer Zahl

Ich möchte eine Zahl im Hostnamen finden. Normalerweise lautet der Hostname der Server ungefähr wie folgt

host01.host.name
host02.host.name

Ich möchte die beiden Ziffern vor dem ersten Symbol, .also 01„oder“ , abrufen 02und einer Variablen zuweisen. Kann mir jemand mit einem geeigneten Befehl helfen?

Antwort1

grepmit PCRE ( -P):

grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt
  • ^[^\d.]*.stimmt mit dem Teil vor den ersten Ziffern von start überein und stellt sicher, dass vor den Ziffern kein steht . \KAndernfalls wird die Übereinstimmung verworfen.

  • \d+stimmt mit einer oder mehreren Ziffern überein

  • (?=\.)ist ein positives Lookahead-Muster mit Nullbreite, das sicherstellt, dass .vorne


Da es mehrere Ausgaben geben wird, speichern Sie diese am besten in einem Array:

output=( $(grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt) )

Jetzt können Sie über die Array-Elemente iterieren oder sie mit den üblichen Array-Zugriffsmethoden verwenden, z. B. um den Wert des n-ten Elements zu erhalten "${output[n]}", verwenden Sie um alle Werte aller Schlüssel zu erhalten "${output[@]}".


sed:

sed -E 's/^[^[:digit:].]*([[:digit:]]+)\..*/\1/' file.txt
  • Ähnlich wie bei grepeinem, ^[^[:digit:].]*passt den Teil vor den ersten Ziffern vom Start an und stellt sicher, dass kein .vor den Ziffern steht

  • ([[:digit:]]+)stimmt mit einer oder mehreren Ziffern überein und fügt sie in die erfasste Gruppe 1 ein

  • \..*passt zu a .und dann zum Rest

  • Beim Ersetzen \1wird nur die erfasste Gruppe verwendet


Beispiel:

$ cat file.txt
host01.host.name
host02.host.name

$ grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt
01
02

$ sed -E 's/^[^[:digit:].]*([[:digit:]]+)\..*/\1/' file.txt
01
02

Antwort2

$ echo host01.host.name | grep --only-matching '[0-9]*'
01

Es verwendet grundlegende reguläre Ausdrücke [0-9]*zum Abgleichen und GNU Greps --only-matching(oder möglicherweise -oandere Greps) zum Filtern der Ausgabe.

Antwort3

echo "host01.host.name host02.host.name" | sed 's/\..*//;s/[^0-9]*//'

oder für dich;

hostname | sed 's/\..*//;s/[^0-9]*//'

alternative Lösung:

echo "host01.host.name host02.host.name" | grep -o "[0-9]*" | head -1

oder für dich;

hostname | grep -o "[0-9]*" | head -1

verwandte Informationen