it-swarm.com.de

Extrahieren Sie das Wort mit grep / sed / awk aus dem String

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öchten das Wort qa extrahieren, das -Dspring.profiles.active folgt.

Ich habe den String in einer Datei text.txt gespeichert, nur um es 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 dev sein.

Ich würde gerne das Wort spring.profiles.active finden und nach das = dieses Wort extrahieren.

Ich möchte dieses Shell-Skript ausführen, da ich das Word verwende, um andere Elemente auf dem Server zu konfigurieren.

Ist das möglich und wenn ja, wie mache ich das?.

12
Gman

Sie können grep mit PCRE (-P) verwenden:

grep -Po 'spring.profiles.active=\K[^ ]+' <<<'.....string.....'
  • spring.profiles.active= passt buchstäblich zu dieser Teilzeichenfolge, \K verwirft die Übereinstimmung

  • [^ ]+ wählt den gewünschten Abschnitt aus, d. H. Den Abschnitt nach spring.profiles.active=, bis zum nächsten Leerzeichen

Für eine Datei:

grep -Po 'spring.profiles.active=\K[^ ]+' file.txt

Beispiel:

% grep -Po 'spring.profiles.active=\K[^ ]+' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa

sed würde eine ähnliche Logik annehmen:

sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'.....string.....'

Beispiel:

% sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa

Fehlerbehandlung:

In Ihrem Skript möchten Sie möglicherweise den Fall behandeln, in dem keine Übereinstimmung vorliegt, dh, in Ihrer ursprünglichen Zeichenfolge ist spring.profiles.active= nicht enthalten. Im obigen Beispiel sed erhalten Sie die gesamte Originalzeichenfolge, was zu Problemen führen kann:

% var="$(sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256')"
% echo $var
00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256

Wenn Sie die leere Zeichenfolge erhalten möchten, wenn keine Übereinstimmung vorliegt, fügen Sie die Option -n zum Befehl sed und die Option p zur Option seds hinzu. Befehl, wie folgt:

% var="$(sed -rn 's/.*spring.profiles.active=([^ ]+).*/\1/p' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256')"
% echo $var

% var="$(sed -rn 's/.*spring.profiles.active=([^ ]+).*/\1/p' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256')"
% echo $var
qa

Dann können Sie testen, ob $ var leer ist oder nicht.

17
heemayl

awk verwenden

awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' <<<'your_string'

oder

awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' your_file

Beispiel

% awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa
1
A.B.

Ich werde einen Perl in die Mischung werfen:

<<<'string' Perl -lane '$F[3]=~s/.*?=//;print($F[3])'
  • -l: Aktiviert die automatische Verarbeitung des Zeilenendes. Es hat zwei separate Effekte. Erstens 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:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
    
  • -e: kann verwendet werden, um eine Programmzeile einzugeben.
% <<<'00:28:04 /usr/lib/jvm/jre/bin/Java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256' Perl -lane '$F[3]=~s/.*?=//;print($F[3])'
qa
1
kos