44

Say I have the string "Memory Used: 19.54M" How would I extract the 19.54 from it? The 19.54 will change frequently so i need to store it in a variable and compare it with the value on the next iteration.

I imagine I need some combination of grep and regex, but I never really understood regex..

Community
  • 1
  • 1
confusified
  • 2,310
  • 7
  • 22
  • 28
  • possible duplicate of [How to trim whitespace from bash variable?](http://stackoverflow.com/questions/369758/how-to-trim-whitespace-from-bash-variable) – user2284570 Jul 26 '14 at 14:10

4 Answers4

83

You probably want to extract it rather than remove it. You can use the Parameter Expansion to extract the value:

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

Note that bash can only compare integers, it has no floating point arithmetics support.

choroba
  • 216,930
  • 22
  • 195
  • 267
47

Other possible solutions:

With grep:

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

With sed:

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

With cut:

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

With awk:

var="Memory Used: 19.54M"
var=`echo "$var" | awk -F'[M ]' '{print $4}'`
Littm
  • 4,903
  • 4
  • 29
  • 37
Onilton Maciel
  • 3,419
  • 1
  • 21
  • 28
4

You can use bash regex support with the =~ operator, as follows:

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

This will print 19.54

Alastair
  • 4,325
  • 1
  • 25
  • 23
1
> echo "Memory Used: 19.54M" | perl -pe 's/\d+\.\d+//g'
Memory Used: M
glenn jackman
  • 223,850
  • 36
  • 205
  • 328
Vijay
  • 62,703
  • 87
  • 215
  • 314