Soru Bash: bir dizenin bir kısmını ayıklamak


"Kullanılan Bellek: 19.54M" dizesi olduğunu varsayalım 19.54'ü bundan nasıl çıkarırdım? 19.54 sıklıkla değişecek, böylece bir değişkendeki saklamak ve bir sonraki iterasyondaki değerle karşılaştırmak zorundayım.

Grep ve regex'in bazı kombinasyonlarına ihtiyacım olduğunu hayal ediyorum ama asla regex'i anlayamadım.


36
2017-10-01 10:18


Menşei


olası kopyası Bash değişkeninden boşluk nasıl kesilir? - user2284570


Cevaplar:


Muhtemelen Ayıkla yerine Kaldır o. Değeri çıkarmak için Parametre Genişletmesini kullanabilirsiniz:

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

Bash'ın yalnızca tamsayıları karşılaştırabileceğini, kayan nokta aritmetiği desteğine sahip olmadığını unutmayın.


62
2017-10-01 10:25



Ekstre yapmak istediğimi daha iyi açıklar. O zaman nasıl üçüncü satırı değiştirebilirim ki "." ve tüm bunları takip eder? - confusified
${var%.*} bir noktayı ve dizenin sonunda izleyen her şeyi kaldırır. - choroba
Mükemmel :) Sadece ihtiyacım olan şey! - confusified
# ve * ne anlama geldiğini sorabilir miyim? - once
@once: yorumlarda yazıldığı gibi, # "sola doğru" anlamına gelir ve * sadece herşeyle eşleşen bir joker karakteridir. - choroba


Diğer olası çözümler:

İle grep:

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

İle sed:

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

İle cut:

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

İle awk:

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

36
2017-10-01 15:09





Bash regex desteğini =~ operatör, aşağıdaki gibi:

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

Bu yazdırılacak 19.54


3
2018-01-11 18:46





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

1
2017-10-01 10:43