Tengo una salida curl como se muestra a continuación y necesito grep solo los números de esa salida.
Salida de rizo
<h1>JVM</h1><p>Free Memory:2144.78 MB Total Memory:3072.00 MB Max Memory:3072.00 MB</p><table border="0">
Comando Grep
grep -o -i 'Max Memory:.*' | awk '{ print $3 }'
Producción
MB</p><table
Salida esperada: 3072.00
Del mismo modo para Memoria Libre y Memoria Total.
Por favor ayuda
Primera solución: con las muestras mostradas, intente seguir en GNU grep
.
grep -oP 'Total Memory:\K\S+' Input_file
O en caso de que desee hacer coincidir los dígitos exactos que vienen para el valor de la memoria, intente lo siguiente:
grep -oP 'Total Memory:\K\d+(?:\.\d+)?(?=\s)' Input_file
Explicación: La explicación simple sería usar las opciones -o
y -P
de GNU grep
en primer lugar. Para imprimir solo el texto coincidente y habilitar el sabor de expresiones regulares PCRE. Luego, en el programa principal grep
, use regex para hacer coincidir la Total Memory:
se buscará seguido de \K
, lo que significa que si se encuentra la coincidencia anterior, olvídese de la coincidencia. Luego, hacer coincidir \S+
significa hacer coincidir todo lo que no sea espacio (s) antes de que llegue un espacio que capturará el valor de la memoria total.
Segunda solución: en caso de que desee obtener 3 valores en la salida para memoria libre, máximo y total, intente seguir el código awk
. Escrito y probado en GNU awk
.
awk -v RS='(Free Memory:|Total Memory:|Max Memory:)[^[:space:]]+' 'RT{sub(/.*:/,"",RT);print RT}' Input_file
NOTA: En caso de que su salida no esté en un archivo de entrada, puede usar la tubería a su comando anterior y luego ejecutar este.
Aquí hay otro gnu grep
para obtener todos los números de memoria en un solo comando:
s='<h1>JVM</h1><p>Free Memory:2144.78 MB Total Memory:3072.00 MB Max Memory:3072.00 MB</p><table border="0">' grep -oP '\w+ Memory:\K[\d.]+' <<< "$s" 2144.78 3072.00 3072.00
También puede usar sed
para extraer todos los detalles necesarios de la cadena:
fm=$(sed -n 's/.*Free Memory:\([^ ]*\).*/\1/p' file) tm=$(sed -n 's/.*Total Memory:\([^ ]*\).*/\1/p' file) mm=$(sed -n 's/.*Max Memory:\([^ ]*\).*/\1/p' file)
Vea la demostración en línea :
#!/bin/bash s='<h1>JVM</h1><p>Free Memory:2144.78 MB Total Memory:3072.00 MB Max Memory:3072.00 MB</p><table border="0">' fm=$(sed -n 's/.*Free Memory:\([^ ]*\).*/\1/p' <<< "$s") tm=$(sed -n 's/.*Total Memory:\([^ ]*\).*/\1/p' <<< "$s") mm=$(sed -n 's/.*Max Memory:\([^ ]*\).*/\1/p' <<< "$s") echo "fm=$fm, tm=$tm, mm=$mm" # => fm=2144.78, tm=3072.00, mm=3072.00
Detalles :
-n
suprime la salida de línea predeterminada.*Free Memory:\([^ ]*\).*
- coincide con toda la línea que contiene.*
- cualquier cero o más caracteresFree Memory:
- una cadena fija\([^ ]*\)
- Grupo 1 ( \1
): cualquier cero o más caracteres que no sean espacios.*
- cualquier cero o más caracteres/\1/
- reemplaza la línea que coincide con el valor del Grupo 1p
- imprime el resultado de la sustitución exitosa.