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><tableSalida 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_fileO 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_fileNOTA: 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.00Tambié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.00Detalles :
-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.