Bir bölümün disk kullanım yüzdesini tamsayı olarak nasıl yakalayabilirim?


16

Bölümün bağlı olduğu dizini kullanarak, belirli bir bölümün disk kullanımını yakalamak için bir yöntem istiyorum. Çıktı sadece bir değişkene kaydetmek istediğim gibi dolgu veya takip sembolleri olmayan bir tam sayı olmalıdır.

Kullandım df --output=pcent /mount/point, ancak gereksiz bir üstbilgi, değerden önce tek boşluk doldurma ve değeri takip eden bir% sembolü olduğu için çıktıyı kesmeniz gerekiyor:

Use%
 83%

Bu durumda istediğim çıktı basit olurdu 83. Çıktısını kullanmanın herhangi bir dezavantajının farkında değilim df, ancak buna dayanmayan diğer yöntemleri kabul etmekten mutluluk duyuyorum.


1
neden basitçe ayrıştırmıyoruz?
Jacob Vlijm

1
Ben de bir dezavantajı görmüyorum, başlık df ile kaldırabilirsiniz sonra | tr -dc '0-9'

Düzeltilmiş duruyorum, başlığı df'den kaldırmak için anahtarı bulamıyorum.

Ben adam sayfasını ve bilgi sayfasını okudum ve ya da @ bc2946088, düşünmek için iyi bağırmak bulamadım, trbaşımı sed ve awk fikirleri ile bir karmaşa başlamıştı.
Arronical

3
Üstbilgi seçeneğini kaldırmak için de arama yaptım. Temel olarak GNU geliştiricileri bunu uygulamaya isteksizdir. Özellik istekleri var ve sadece hayır dediler.
Sergiy Kolodyazhnyy

Yanıtlar:


19

Kullanırdım ...

df --output=pcent /mount/point | tr -dc '0-9'

Sed'in daha hızlı olup olmadığından emin değilim, ama sed değerlerini hatırlayamıyorum.


1
Kullanılması timesed kadar hızlı olarak çıkar test etmek.
Arronical

4
@ Çıktılarınız% 100'den fazla waaaaaaaaaaaay değilse, çok fazla fark göreceğinizden şüpheliyim. : P
muru

@ Arronical Muru ne dedi; çağırma süresinin baskın olması muhtemeldir.
CVn

1
Bu durumda, trokunması daha kolaydır sed.
Paddy Landau

7

İşte awk çözümü:

$ df --output=pcent /mnt/HDD | awk -F'%' 'NR==2{print $1}'   
 37

Temelde burada olan şey '%' karakterine alan ayırıcısı (sütun sınırlayıcı) olarak davranmamız ve ilk sütun $ 1'i yalnızca kayıt sayısı ikiye ( NR==2parça) eşit olduğunda yazdırmamızdır.

bash-Sadece araçları kullanmak isteseydik , şöyle bir şey yapabiliriz:

bash-4.3$ df --output=pcent / | while IFS= read -r line; do 
>     ((c++)); 
>     [ $c -eq 2 ] && echo "${line%\%*}" ;
> done
 74

Ve eğlence için, sedyakalama grubu üzerinden alternatif ve -ruzun süreli normal ifade:

df --output=pcent | sed -nr '/[[:digit:]]/{s/[[:space:]]+([[:digit:]]+)%/\1/;p}'

6

sed çözüm

df --output=pcent /mount/point | sed '1d;s/^ //;s/%//'
  • 1d ilk satırı sil
  • ; komutları ayırmak
  • s/^ // satır başından boşluk kaldırma
  • s/%//%işareti kaldır

6

grepSadece rakamları çıkaran bir boruya geçebilirsiniz :

df --output=pcent /mount/point | grep -o '[0-9]*'

Canlı izleyin:

$ echo "Use%
> 83%" | grep -o '[0-9]*'
83

1

--Output = pcent henüz uygulanmadığı bir sunucuya geldim, bu yüzden normal çıktıyı, sütuna göre filtrelenmiş, ardından normal ifadeyi kullandım: df /mount/point | awk '{print $5}' | tr -dc '0-9'


1
-F veya - taşınabilirliğe df eklemeniz gerekir; aksi takdirde / mount / noktası uzunsa satır kesmeye başlar ve yanlış değer elde edersiniz.
SvennD

1

Bash iki aşamalı çözüm

Geçen yıl bir bash (Borne Again SHell) hayranı olarak onu kullanarak bir çözüm önerebileceğimi düşündüm.

$ DF_PCT=$(df --output=pcent /mnt/d)
$ echo ${DF_PCT//[!0-9]/}
5
  • Satır 1 dfçıktıyı değişkene yakalar DF_PCT.
  • Satır 2, rakam olmayan her şeyi sıyırır DF_PCTve ekranda görüntüler.
  • Kabul edilen cevabın avantajı, yüzde ( 5bu durumda) oluşturulduktan sonraki satır beslemesidir .

1

İşte başka bir çözüm:

df | grep /mount/point | awk '{ print $5 }' | cut -d'%' -f1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.