Tengo una cuerda
00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256
y quiero extraer la palabra qa
que sigue -Dspring.profiles.active
.
Tengo la cadena guardada en un archivo text.txt solo para hacer una demostración en ella.
Cuando lo hago
grep -r -o "spring.profiles.active=" text.txt
El resultado es spring.profiles.active=
Esta palabra no siempre es qa
, podría ser prod
o dev
.
Lo que me gustaría hacer es encontrar la palabra spring.profiles.active
y después el =
extracto de esa palabra.
Me gustaría hacer un script de shell porque uso la palabra para configurar otros elementos en el servidor.
¿Es esto posible? Y si es así, ¿cómo lo hago?
Respuestas:
Puede usar
grep
con PCRE (-P
):spring.profiles.active=
coincidirá con esta subcadena literalmente,\K
descartará la coincidencia[^ ]+
seleccionará la porción deseada, es decir, la porción posteriorspring.profiles.active=
, hasta el siguiente espacioPara un archivo:
Ejemplo:
sed
tomaría una lógica similar:Ejemplo:
Errores de manejo:
En su secuencia de comandos, es posible que desee manejar el caso donde no hay coincidencia, en otras palabras, donde su cadena original no contiene
spring.profiles.active=
. En elsed
ejemplo anterior , obtiene la cadena original completa, lo que podría crear problemas:Si prefiere obtener la cadena vacía cuando no hay coincidencia, agregue la
-n
opción alsed
comando y lap
opción alsed
s
comando, así:Luego puede probar si $ var está vacío o no.
fuente
var="$(grep -Po 'spring.profiles.active=\K[^ ]+' file.txt)"
reemplazarfile.txt
con<<<'...string...'
si la entrada es una cadena, no un file..then que puede hacerif [ "$var" = 'qa' ]; then do something; else do something; fi
Utilizando
awk
o
Ejemplo
fuente
Lanzaré una Perl en la mezcla:
-l
: habilita el procesamiento automático de final de línea. Tiene dos efectos separados. Primero, automáticamente divide $ / (el separador de registro de entrada) cuando se usa con -n o -p. En segundo lugar, asigna $ \ (el separador de registro de salida) para tener el valor de octnum, de modo que cualquier declaración de impresión tendrá ese separador agregado nuevamente. Si se omite octnum, establece $ \ en el valor actual de $ /.-a
: activa el modo de división automática cuando se usa con -n o -p. Un comando de división implícito para la matriz @F se realiza como lo primero dentro del bucle while implícito producido por -n o -p.n
: hace que Perl asuma el siguiente ciclo alrededor de su programa, lo que lo hace iterar sobre argumentos de nombre de archivo algo así como sed -n o awk:-e
: puede usarse para ingresar una línea de programa.fuente
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'