2012-10-01 11 views
34

Powiedz, że mam ciąg "Memory Used: 19.54M" Jak wyodrębnić 19.54 z niego? 19.54 będzie się często zmieniał, więc muszę przechowywać go w zmiennej i porównać z wartością w następnej iteracji.Bash: wyodrębnianie części ciągu znaków

Wyobrażam Potrzebuję kombinacji grep i regex, ale nigdy naprawdę rozumieć regex ..

+0

możliwe duplikat [Jak przycinać spacja ze zmiennej bash?] (http://stackoverflow.com/questions/369758/how-to-trim-whitespace-z-bash-variabl e) – user2284570

Odpowiedz

60

Prawdopodobnie chcesz ekstrakt to zamiast usunąć go. Można użyć dopełniania parametrów, aby wyodrębnić wartość:

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

Zauważ, że bash można porównać tylko liczby całkowite, nie ma wsparcia pływający punkt arytmetyki.

+0

Wyciąg lepiej wyjaśnia, co chcę zrobić. Jak zatem zmienić trzecią linię, aby usunąć "." i wszystko, co następuje po nim? – confusified

+8

'$ {var%. *}" Usuwa kropkę i cokolwiek za nią pod koniec łańcucha. – choroba

+0

Perfect :) Właśnie tego potrzebuję! – confusified

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

Inne możliwe rozwiązania:

Z grep:

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

z sed:

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

z cut:

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

Z awk:

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

Można użyć wsparcia regex bash z operatorem =~, w następujący sposób:

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

To będzie drukować 19.54

Powiązane problemy