2012-10-01 28 views
34

Dire che ho la stringa "Memoria utilizzata: 19.54M" Come estrarre il 19.54 da esso? Il 19.54 cambierà di frequente quindi ho bisogno di memorizzarlo in una variabile e confrontarlo con il valore alla successiva iterazione.Bash: estrarre parte di una stringa

immagino ho bisogno di qualche combinazione di grep e regex, ma non ho mai veramente capito regex ..

+0

possibile duplicato di [come tagliare spazio bianco dalla variabile bash?] (http://stackoverflow.com/questions/369758/how-to-trim-whitespace-from-bash-variabl e) – user2284570

risposta

60

Probabilmente si desidera estratto esso, piuttosto che rimuovere esso. È possibile utilizzare l'espansione dei parametri per estrarre il valore:

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

Si noti che bash può confrontare solo numeri interi, non ha il supporto punto di aritmetica floating.

+0

Extract spiega meglio cosa voglio fare. Come poi cambierei la terza riga per rimuovere il "." e tutto ciò che segue? – confusified

+8

'$ {var%. *}' Rimuove un punto e tutto ciò che lo segue alla fine della stringa. – choroba

+0

Perfetto :) Proprio quello di cui ho bisogno! – confusified

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

Altre soluzioni possibili:

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

È possibile utilizzare il supporto regex bash con l'operatore =~, come segue:

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

Questo stamperà 19.54

Problemi correlati