Eu tenho uma corda
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
a seguir -Dspring.profiles.active
.
Eu tenho a seqüência de salvar em um arquivo text.txt apenas para demonstração nele.
Quando eu faço
grep -r -o "spring.profiles.active=" text.txt
O resultado é spring.profiles.active=
Esta palavra nem sempre é qa
, poderia ser prod
ou dev
.
O que eu gostaria de fazer é encontrar a palavra spring.profiles.active
e após o =
extrato essa palavra.
Gostaria de fazer o shell script disso porque uso a palavra para configurar outros itens no servidor.
Isso é possível e, em caso afirmativo, como faço.
Respostas:
Você pode usar
grep
com PCRE (-P
):spring.profiles.active=
corresponderá a essa substring literalmente,\K
descartará a correspondência[^ ]+
selecionará a porção desejada, ou seja, a porção seguintespring.profiles.active=
, até o próximo espaçoPara um arquivo:
Exemplo:
sed
levaria lógica semelhante:Exemplo:
Manipulando erros:
No seu script, você pode lidar com o caso em que não há correspondência, ou seja, onde a string original não contém
spring.profiles.active=
. Nosed
exemplo acima , você obtém toda a cadeia original, o que pode criar problemas:Se você preferir obter a sequência vazia quando não houver correspondência, adicione a
-n
opção aosed
comando e ap
opção aosed
s
comando, desta forma:Então você pode testar se $ var está vazio ou não.
fonte
var="$(grep -Po 'spring.profiles.active=\K[^ ]+' file.txt)"
substituirfile.txt
com<<<'...string...'
se a entrada é uma string, não um file..then você pode fazerif [ "$var" = 'qa' ]; then do something; else do something; fi
Usando
awk
ou
Exemplo
fonte
Vou jogar um Perl na mistura:
-l
: ativa o processamento automático de final de linha. Tem dois efeitos separados. Primeiro, ele copia automaticamente $ / (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, para que quaisquer instruções de impressão tenham esse separador adicionado novamente. Se o octnum for omitido, configure $ \ para o valor atual de $ /.-a
: ativa o modo de divisão automática quando usado com -n ou -p. Um comando de divisão implícito na matriz @F é feito como a primeira coisa dentro do loop while implícito produzido pelo -n ou -p.n
: faz com que o Perl assuma o seguinte loop em torno do seu programa, o que faz com que ele itere sobre os argumentos do nome do arquivo, como sed -n ou awk:-e
: pode ser usado para inserir uma linha do programa.fonte
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'