2012-10-01 16 views
34

"Kullanılan Bellek: 19.54M" dizgisi var mı? 19.54'ü bundan nasıl ayırım? 19.54 sık sık değişecektir, bu yüzden onu bir değişkende saklamak ve sonraki iterasyondaki değerle karşılaştırmak zorundayım.Bash: bir dizgenin bir parçasının çıkarılması

o ziyade bunu kaldırmak

+0

olası yinelenen [Nasıl kırpmaya yazdırır bash değişkeninden gelen boşluk nedir?] (http://stackoverflow.com/questions/369758/how-to-trim-whitespace-from-bash-variabl e) – user2284570

cevap

60

Muhtemelen istiyorum özü için .. ben grep ve regex bazı kombinasyonlarını gerek hayal, ama gerçekten normal ifade anlayamadım. Bu değeri ayıklamak için Parametre Genişletme kullanabilirsiniz: o bash yalnızca tamsayılar karşılaştırabilirsiniz

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

Not, hiç kayan nokta aritmetiği desteği vardır.

+0

Ekstresi yapmak istediklerimi daha iyi açıklar. O zaman nasıl üçüncü satırı değiştirebilirim ki "." ve tüm bunları takip eder? – confusified

+8

'$ {var%. *}', Bir noktayı ve dizenin sonunda izleyen her şeyi kaldırır. – choroba

+0

Mükemmel :) Sadece ihtiyacım olan şey! – confusified

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

Diğer olası çözümler:

grep ile:

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

sed ile:

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

cut ile:

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

:

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

aşağıdaki gibi, =~ operatör ile bash regex desteği kullanabilirsiniz:

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

Bu 19.54

ait
İlgili konular