Ich habe eine Schnur
00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256
und möchte qa
das folgende Wort extrahieren -Dspring.profiles.active
.
Ich habe die Zeichenfolge in einer Datei text.txt gespeichert, nur um sie zu testen.
Wenn ich es tue
grep -r -o "spring.profiles.active=" text.txt
Das Ergebnis ist spring.profiles.active=
Dieses Wort ist nicht immer qa
, es könnte prod
oder sein dev
.
Was ich tun möchte, ist das Wort zu finden spring.profiles.active
und dieses Wort nach dem =
Extrahieren.
Ich möchte dieses Skript als Shell ausführen, da ich das Wort verwende , um andere Elemente auf dem Server zu konfigurieren.
Ist das möglich und wenn ja, wie mache ich das?
Antworten:
Sie können
grep
mit PCRE (-P
) Folgendes verwenden :spring.profiles.active=
wird buchstäblich mit diesem Teilstring übereinstimmen,\K
wird die Übereinstimmung verwerfen[^ ]+
wählt die gewünschte Portion aus, dh die Portion danachspring.profiles.active=
, bis zum nächsten LeerzeichenFür eine Datei:
Beispiel:
sed
würde eine ähnliche Logik annehmen:Beispiel:
Fehlerbehandlung:
In Ihrem Skript möchten Sie möglicherweise den Fall behandeln, in dem es keine Übereinstimmung gibt, dh in dem Ihre ursprüngliche Zeichenfolge keine enthält
spring.profiles.active=
. Im obigensed
Beispiel erhalten Sie die gesamte Originalzeichenfolge, was zu Problemen führen kann:Wenn Sie die leere Zeichenfolge lieber abrufen möchten, wenn keine Übereinstimmung vorliegt, fügen Sie die
-n
Option zumsed
Befehl und diep
Option zumsed
s
Befehl wie folgt hinzu :Dann können Sie testen, ob $ var leer ist oder nicht.
quelle
var="$(grep -Po 'spring.profiles.active=\K[^ ]+' file.txt)"
Ersetzenfile.txt
mit ,<<<'...string...'
wenn der Eingang ein String ist, kein file..then Sie tun könnenif [ "$var" = 'qa' ]; then do something; else do something; fi
Verwenden
awk
oder
Beispiel
quelle
Ich werde einen Perl in die Mischung werfen:
-l
: Aktiviert die automatische Verarbeitung des Zeilenendes. Es hat zwei separate Effekte. Zuerst wird automatisch $ / (das Trennzeichen für Eingabedatensätze) bei Verwendung von -n oder -p ausgewählt. Zweitens weist es $ \ (das Trennzeichen für Ausgabedatensätze) den Wert octnum zu, damit bei allen Druckanweisungen dieses Trennzeichen wieder hinzugefügt wird. Wenn octnum weggelassen wird, wird $ \ auf den aktuellen Wert von $ / gesetzt.-a
: Aktiviert den Autosplit-Modus bei Verwendung mit einem -n oder -p. Ein impliziter Split-Befehl für das @F-Array wird als erstes in der impliziten while-Schleife ausgeführt, die von -n oder -p erzeugt wird.n
: veranlasst Perl, die folgende Schleife um Ihr Programm anzunehmen, wodurch es über Dateinamenargumente wie sed -n oder awk iteriert:-e
: kann verwendet werden, um eine Programmzeile einzugeben.quelle
perl -nle '/spring.profiles.active=\K([^ ]+)/ && print $1' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'