Extrai palavra da string usando grep / sed / awk

10

Eu tenho uma string

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

e deseja extrair a palavra qa que segue -Dspring.profiles.active .

Eu tenho a string salvar em um arquivo text.txt apenas para demostrar nela.

Quando faço

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

O resultado é spring.profiles.active=

Esta palavra nem sempre é qa , pode ser prod ou dev .

O que eu gostaria de fazer é encontrar a palavra spring.profiles.active e após a = extrair essa palavra.

Eu gostaria de fazer o script shell porque uso a palavra para configurar outros itens no servidor.

Isso é possível e, em caso afirmativo, como faço isso?

    
por Gman 12.11.2015 / 12:22

3 respostas

12

Você pode usar grep com PCRE ( -P ):

grep -Po 'spring.profiles.active=\K[^ ]+' <<<'.....string.....'
  • spring.profiles.active= corresponderá a essa subseqüência literalmente, \K descartará a correspondência

  • [^ ]+ selecionará a parte desejada, ou seja, a parte após spring.profiles.active= , até o próximo espaço

Para um arquivo:

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

Exemplo:

% 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 usaria uma lógica semelhante:

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

Exemplo:

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

Tratamento de erros:

Em seu script, você pode querer lidar com o caso em que não há correspondência, em outras palavras, onde sua string original não contém spring.profiles.active= . No exemplo acima de sed , você obtém toda a string original, o que pode criar problemas:

% var="$(sed -r 's/.*spring.profiles.active=([^ ]+).*//' <<<'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 você preferir obter a string vazia quando não houver correspondência, adicione a opção -n ao comando sed e a opção p ao comando sed s , desta forma:

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

Então você pode testar se $ var está vazio ou não.

    
por heemayl 12.11.2015 / 12:26
1

Usando awk

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

ou

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

Exemplo

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

Vou jogar um Perl no mix:

<<<'string' perl -lane '$F[3]=~s/.*?=//;print($F[3])'
  • -l : ativa o processamento automático de finalização de linha. Tem dois efeitos separados. Primeiro, ele automaticamente efetua chps $ / (o separador de registro de entrada) quando usado com -n ou -p. Segundo, ele atribui $ \ (o separador de registro de saída) para ter o valor de octnum, de forma que quaisquer instruções de impressão tenham esse separador novamente incluído. Se octnum for omitido, define $ \ para o valor atual de $ /.
  • -a : ativa o modo de preenchimento automático quando usado com um -n ou -p. Um comando split implícito para o array @F é feito como a primeira coisa dentro do loop while implícito produzido por -n ou -p.
  • n : faz com que o Perl assuma o seguinte loop em torno do seu programa, o que faz com que seja iterado sobre argumentos de nome de arquivo como sed -n ou awk:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
    
  • -e : pode ser usado para inserir uma linha de programa.
% <<<'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
    
por kos 12.11.2015 / 13:35