2012-10-01 45 views
34

Giả sử tôi có chuỗi "Bộ nhớ đã sử dụng: 19.54M" Làm cách nào để trích xuất 19.54 từ nó? 19,54 sẽ thay đổi thường xuyên vì vậy tôi cần lưu trữ nó trong một biến và so sánh nó với giá trị trên lần lặp tiếp theo.Bash: trích xuất một phần của chuỗi

Tôi tưởng tượng tôi cần một số sự kết hợp của grep và regex, nhưng tôi không bao giờ thực sự hiểu regex ..

+0

thể trùng lặp của [Làm thế nào để cắt khoảng trắng từ biến bash?] (http://stackoverflow.com/questions/369758/how-to-trim-whitespace-from-bash-variabl e) – user2284570

Trả lời

60

Bạn có thể muốn chiết xuất nó chứ không phải là loại bỏ nó. Bạn có thể sử dụng Mở rộng tham số để trích xuất giá trị:

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

Lưu ý rằng bash chỉ có thể so sánh các số nguyên, nó không có hỗ trợ điểm nổi.

+0

Trích xuất giải thích rõ hơn những gì tôi muốn làm. Làm thế nào sau đó tôi sẽ thay đổi dòng thứ ba để loại bỏ "." và tất cả những gì theo sau nó? – confusified

+8

'$ {var%. *}' Xóa một dấu chấm và bất kỳ thứ gì theo sau dấu chấm ở cuối chuỗi. – choroba

+0

Hoàn hảo :) Chỉ cần những gì tôi cần! – confusified

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

giải pháp khả thi khác:

Với grep:

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

Với sed:

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

Với cut:

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

Với awk:

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

Bạn có thể sử dụng hỗ trợ regex bash với các nhà điều hành =~, như sau:

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

này sẽ in 19.54

Các vấn đề liên quan