45

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,320
  • 7
  • 22
  • 29
  • 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

87

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
  • 231,213
  • 25
  • 204
  • 289
50

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,923
  • 4
  • 30
  • 38
Onilton Maciel
  • 3,559
  • 1
  • 25
  • 29
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,475
  • 1
  • 26
  • 23
1
> echo "Memory Used: 19.54M" | perl -pe 's/\d+\.\d+//g'
Memory Used: M
glenn jackman
  • 238,783
  • 38
  • 220
  • 352
Vijay
  • 65,327
  • 90
  • 227
  • 319