Estrai la parola dalla stringa usando grep / sed / awk


12

Ho una corda

00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256

e vuoi estrarre la parola qache segue -Dspring.profiles.active.

Ho il salvataggio della stringa in un file text.txt solo per dimostrarlo.

Quando io faccio

grep -r -o "spring.profiles.active=" text.txt

Il risultato è spring.profiles.active=

Questa parola non è sempre qa, potrebbe essere prodo dev.

Quello che mi piacerebbe fare è trovare la parola spring.profiles.activee , dopo l' =estratto di quella parola.

Vorrei shell script questo perché uso la parola per configurare altri elementi sul server.

È possibile e, in caso affermativo, come posso farlo.


Immagino che ci siano già state meta conversazioni su questo, ma questa domanda è completamente non specifica per Ubuntu. Perché è qui invece di unix.stackexchange.com ?
Tony Adams,

@TonyAdams Sì, ci sono: le domande sull'elaborazione del testo sono state indirettamente trattate qui , e comunque di fatto sono state sempre considerate in tema e mai chiuse / migrate; sulla specificità di Ubuntu, che è stata coperta più volte, due volte solo recentemente qui e nel duplicato e una volta qui .
kos,

buona domanda! : D
ncomputer

Risposte:


19

È possibile utilizzare grepcon PCRE ( -P):

grep -Po 'spring.profiles.active=\K[^ ]+' <<<'.....string.....'
  • spring.profiles.active=abbinerà letteralmente questa sottostringa, \Keliminerà la corrispondenza

  • [^ ]+selezionerà la porzione desiderata, ovvero la porzione successiva spring.profiles.active=, fino allo spazio successivo

Per un file:

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

Esempio:

% 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 prenderebbe una logica simile:

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

Esempio:

% 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

Gestione degli errori:

Nel tuo script potresti voler gestire il caso in cui non c'è corrispondenza, in altre parole in cui la stringa originale non contiene spring.profiles.active=. Nell'esempio sopra sed, ottieni l'intera stringa originale, che potrebbe creare problemi:

% 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

Se si preferisce ottenere la stringa vuota in assenza di corrispondenza, aggiungere l' -nopzione al sedcomando e l' popzione al sed scomando, in questo modo:

% 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

Quindi puoi verificare se $ var è vuoto o meno.


Grazie @heemay, funziona perfettamente. ora ho solo bisogno di copiarlo. Lo
segnerò

@heemay vorresti sapere come ho potuto scrivere questo. L'ho in uno script e quando viene eseguito restituisce qa. Voglio salvare il risultato in una variabile chiamata env e poi confrontarlo con qualcosa del genere. If [env == qa]; quindi // DO Something ... else Do Something ...
Gman,

1
@Gman Sì .. basta usare la sostituzione dei comandi: var="$(grep -Po 'spring.profiles.active=\K[^ ]+' file.txt)"sostituisci file.txtcon <<<'...string...'se l'input è una stringa, non un file ... quindi puoi farloif [ "$var" = 'qa' ]; then do something; else do something; fi
heemayl

1

utilizzando awk

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

o

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

Esempio

% 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

Ne lancio uno Perl nel mix:

<<<'string' perl -lane '$F[3]=~s/.*?=//;print($F[3])'
  • -l: abilita l'elaborazione automatica della fine della linea. Ha due effetti separati. Innanzitutto, chomps $ / (il separatore del record di input) automaticamente se usato con -n o -p. In secondo luogo, assegna $ \ (il separatore del record di output) per avere il valore di ottnum in modo che qualsiasi istruzione di stampa abbia quel separatore aggiunto di nuovo. Se l'ottetto viene omesso, imposta $ \ sul valore corrente di $ /.
  • -a: attiva la modalità autosplit quando usato con a -n o -p. Un comando di divisione implicita nell'array @F viene eseguito come prima cosa all'interno del ciclo while implicito prodotto da -n o -p.
  • n: fa sì che Perl assuma il seguente ciclo attorno al programma, il che lo fa scorrere su argomenti di file un po 'come sed -n o awk:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
  • -e: può essere usato per inserire una riga di programma.
% <<<'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

regex originale può essere usato anche in questo modo: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,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.