Cómo get una subcadena basada en el índice de otra cadena

Necesito extraer el valor integer de algunos files de logging. El valor integer siempre aparece después de un return code subcadena. Pero puede o no tener cosas adicionales después de esta subcadena. A continuación hay dos inputs de ejemplo:

 Job with id 0 ended with status COMPLETED, return code 16, in 1 minute 12 seconds Job with id 0 COMPLETED with return code 255 

Entonces, aquí quiero 16 en el primer caso y 255 en el segundo caso.

Mi enfoque inicial fue usar awk, pero la columna en la que se produce el valor requerido no es consistente; así que falló.

¿Cómo logro esto de manera confiable?

Use la expansión de parameters:

 #! /bin/bash strings=('Job with id 0 ended with status COMPLETED, return code 16, in 1 minute 12 seconds' 'Job with id 0 COMPLETED with return code 255' ) for string in "${strings[@]}" ; do code=${string#*return code } code=${code%%[!0-9]*} echo $code done 

# elimina el patrón de la izquierda, % de la derecha.

Usando perl una solución usando regexp podría ser:

perl -ne 'print "$2\n" if m/(code )(\d*)/' a.txt

Esto imprime los numbers 16 y 255 a stdout, cada uno en una línea separada ( \n ). Aquí a.txt contiene las dos líneas

 Job with id 0 ended with status COMPLETED, return code 16, in 1 minute 12 seconds Job with id 0 COMPLETED with return code 255 

Aquí hay una versión sed :

 sed -e 's/.*return code \([0-9]\+\).*/\1/' logfile.txt 

Elimina todo de la línea excepto los dígitos inmediatamente después del return code .

o, usando expresiones regulares extendidas con GNU sed:

 sed -r -e 's/.*return code ([0-9]+).*/\1/' logfile.txt 

NOTA: algunas versiones de sed usan -E lugar de -r para habilitar expresiones regulares extendidas.

También tenga en count que estos scripts sed imprimirán sin cambios las líneas que no coincidan con la expresión regular. Si eso no es lo que desea, use la opción sed -n y el command p para imprimir solo líneas coincidentes, por ejemplo:

 sed -n -r -e 's/.*return code ([0-9]+).*/\1/p' logfile.txt