2012-10-01 20 views
34

decir que tengo la cadena "Memoria utilizada: 19.54M" ¿cómo iba a extraer el 19,54 de ella? El 19.54 va a cambiar con frecuencia por eso es necesario almacenarlo en una variable y compararlo con el valor en la siguiente iteración.Bash: extraer parte de una cadena

Imagino que necesito alguna combinación de grep y expresiones regulares, pero nunca he entendido realmente expresiones regulares ..

+0

posible duplicado de [¿Cómo recortar espacio en blanco de la variable de bash?] (http://stackoverflow.com/questions/369758/how-to-trim-whitespace-from-bash-variabl e) – user2284570

Respuesta

60

Es posible que desee extracto de ella en lugar de eliminar ella. Se puede utilizar el parámetro de expansión para extraer el valor:

var="Memory Used: 19.54M" 
var=${var#*: }   # Remove everything up to a colon and space 
var=${var%M}    # Remove the M at the end 

Tenga en cuenta que sólo puede fiesta comparar números enteros, no tiene punto de apoyo aritmética flotante.

+0

Extracto de no explicar mejor lo que yo quiero hacer. ¿Cómo cambiaría la tercera línea para eliminar el "." y todo lo que sigue? – confusified

+8

'$ {var%. *}' Elimina un punto y cualquier cosa que siga al final de la cadena. – choroba

+0

Perfecto :) ¡Justo lo que necesito! – confusified

1
> echo "Memory Used: 19.54M" | perl -pe 's/\d+\.\d+//g' 
Memory Used: M 
33

Otras soluciones posibles:

Con grep:

var="Memory Used: 19.54M" 
var=`echo "$var" | grep -o "[0-9.]\+"` 

Con sed:

var="Memory Used: 19.54M" 
var=`echo "$var" | sed 's/.*\ \([0-9\.]\+\).*/\1/g'` 

Con cut:

var="Memory Used: 19.54M" 
var=`echo "$var" | cut -d ' ' -f 3 | cut -d 'M' -f 1` 

Con awk:

var="Memory Used: 19.54M" 
var=`echo "$var" | awk -F'[M ]' '{print $4}'` 
3

Puede utilizar el soporte de expresiones regulares fiesta con el operador =~, de la siguiente manera:

var="Memory Used: 19.54M" 
if [[ $var =~ Memory\ Used:\ (.+)M ]]; then 
    echo ${BASH_REMATCH[1]} 
fi 

Esto imprimirá 19.54

Cuestiones relacionadas