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 02
und einer Variablen zuweisen. Kann mir jemand mit einem geeigneten Befehl helfen?
Antwort1
grep
mit 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 .\K
Andernfalls 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
grep
einem,^[^[: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 RestBeim Ersetzen
\1
wird 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 -o
andere 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