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


12

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 qadas 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 prododer sein dev.

Was ich tun möchte, ist das Wort zu finden spring.profiles.activeund 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?


Ich vermute, es gab bereits Meta-Gespräche darüber, aber diese Frage ist für Ubuntu völlig unspezifisch. Warum ist es hier anstelle von unix.stackexchange.com ?
Tony Adams

@TonyAdams Ja , es hat: Textverarbeitung Fragen haben indirekt abgedeckt hier , und ohnehin de facto wurden sie beim Thema immer in Betracht gezogen und nie geschlossen / gewandert; auf die Ubuntu-Spezifität, die mehrfach behandelt wurde, erst kürzlich zweimal hier und im Duplikat und einmal hier .
Kos

gute Frage! : D
ncomputers

Antworten:


17

Sie können grepmit PCRE ( -P) Folgendes verwenden :

grep -Po 'spring.profiles.active=\K[^ ]+' <<<'.....string.....'
  • spring.profiles.active=wird buchstäblich mit diesem Teilstring übereinstimmen, \Kwird die Übereinstimmung verwerfen

  • [^ ]+wählt die gewünschte Portion aus, dh die Portion danach 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 es keine Übereinstimmung gibt, dh in dem Ihre ursprüngliche Zeichenfolge keine enthält spring.profiles.active=. Im obigen sedBeispiel 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 lieber abrufen möchten, wenn keine Übereinstimmung vorliegt, fügen Sie die -nOption zum sedBefehl und die pOption zum sed sBefehl wie folgt hinzu :

% 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.


Danke @heemay, funktioniert einwandfrei. Jetzt muss ich nur noch das Skript schreiben. Ich werde es als beantwortet markieren
Gman

@heemay würdest du wissen, wie ich das skripten könnte. Ich habe es in einem Skript und wenn es ausgeführt wird, gibt es qa zurück. Ich möchte das Ergebnis in einer Variablen namens env speichern und das dann mit so etwas wie vergleichen. If [env == qa]; dann // etwas tun ... sonst etwas tun ...
Gman

1
@Gman Yeah .. nur Befehlsersetzung verwenden: var="$(grep -Po 'spring.profiles.active=\K[^ ]+' file.txt)"Ersetzen file.txtmit , <<<'...string...'wenn der Eingang ein String ist, kein file..then Sie tun könnenif [ "$var" = 'qa' ]; then do something; else do something; fi
heemayl

1

Verwenden awk

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

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. 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:

    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

Orginal Regex kann auch so verwendet werden: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'
Manwe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.