2011-12-06 30 views
16

tôi sử dụng lệnh df trong một kịch bản bash:Làm thế nào để làm cho GREP chỉ chọn giá trị số?

df . -B MB | tail -1 | awk {'print $4'} | grep .[0-9]* 

kịch bản này trả về:

99% 

Nhưng tôi cần chỉ số (để thực hiện so sánh tiếp theo). Nếu tôi sử dụng grep regex mà không có dấu chấm:

df . -B MB | tail -1 | awk {'print $4'} | grep .[0-9]* 

tôi không nhận được gì. Cách khắc phục?

Trả lời

36

Nếu bạn cố gắng:

echo "99%" |grep -o '[0-9]*' 

Nó trả về:

99 

Dưới đây là các chi tiết trên -o (hoặc --only-matching cờ) hoạt động từ grep manual page.

Chỉ in các phần phù hợp (không trống) của các đường khớp, với mỗi phần như vậy trên một dòng đầu ra riêng biệt. Các dòng đầu ra sử dụng các dấu phân tách giống như đầu vào, và các dấu phân tách là các byte rỗng nếu -z (--null-data) cũng được sử dụng (xem Other Options).

+0

Bạn cũng có thể sử dụng bí danh '\ d' như' echo '99% "| grep -o' \ d * '' –

+1

Bạn có chắc chắn về @FabSa đó không? bạn đã làm bài kiểm tra chưa? AFAK, grep mặc định sử dụng BRE .. – Kent

+2

Nó làm việc cho tôi có (trên OsX) nhưng có lẽ bạn cần "mở rộng-regexp" (với '-E') –

8

grep sẽ in bất kỳ dòng khớp với mẫu bạn cung cấp. Nếu bạn chỉ muốn in một phần của dòng phù hợp với mô hình, bạn có thể vượt qua các tùy chọn -o:

-o, thảo mà chỉ khớp In chỉ phù hợp (phi trống) các phần của một đường thẳng, với mỗi phần như vậy trên một dòng đầu ra riêng biệt.

Như thế này:

echo 'Here is a line mentioning 99% somewhere' | grep -o '[0-9]+' 
+1

Điều này sẽ không hoạt động trên tất cả các phiên bản/bản dựng của grep. Bạn sẽ cần -P hoặc -E Vì vậy, thao tác này sẽ hoạt động echo 'Đây là dòng đề cập đến 99% ở đâu đó' | grep -oP '[0-9] +' Hoặc echo 'Đây là dòng đề cập đến 99% ở đâu đó' | grep -oP '[0-9] +' –

1

Làm thế nào về:

df . -B MB | tail -1 | awk {'print $4'} | cut -d'%' -f1 
1

Không cần phải sử dụng grep đây, Hãy thử điều này:

df . -B MB | tail -1 | awk {'print substr($5, 1, length($5)-1)'} 
1
function getPercentUsed() { 
    $sys = system("df -h /dev/sda6 --output=pcent | grep -o '[0-9]*'", $val); 
    return $val[0]; 
} 
0

Không sử dụng nhiều lệnh hơn mức cần thiết, để lại đuôi, grep và cắt. Bạn có thể làm điều này với chỉ (đơn giản) awk

PS: đưa ra một khối có kích thước en chỉ in de persentage là một chút ngớ ngẩn ;-) Do đó, hãy cũng đi "MB -B"

df.| Awk -F '[nhiều seperators lĩnh vực]' '$ NF == "lĩnh vực cuối phải được chính xác -> gắn patition" {print $ (NF- số từ trường cuối cùng)}'

trong trường hợp của bạn, sử dụng:

df . |awk -F'[ %]' '$NF=="/" {print $(NF-2)}' 

đầu ra:

Nếu bạn muốn hiển thị các biểu tượng phần trăm, bạn có thể rời khỏi -F '[%] đi và lĩnh vực in của bạn sẽ di chuyển 1 lĩnh vực hơn nữa lại

df . |awk '$NF=="/" {print $(NF-1)}' 

đầu ra:81%

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