Bagaimana cara menangkap persentase penggunaan disk dari partisi sebagai integer?

16

Saya ingin metode untuk menangkap penggunaan disk pada partisi tertentu, dengan menggunakan direktori tempat partisi tersebut dipasang. Outputnya harus berupa integer tanpa padding atau simbol berikut, karena saya ingin menyimpannya dalam variabel.

Saya telah menggunakan df --output=pcent /mount/point, tetapi perlu memangkas output karena memiliki header yang tidak perlu, spasi tunggal sebelum nilai, dan simbol% ​​mengikuti nilai seperti:

Use%
 83%

Dalam hal ini output yang saya inginkan hanyalah 83. Saya tidak mengetahui adanya kekurangan untuk menggunakan output dari df, tetapi saya senang menerima metode lain yang tidak bergantung padanya.

Arronikal
sumber
1
mengapa tidak hanya menguraikannya?
Jacob Vlijm
1
Saya juga tidak melihat kekurangannya, Anda bisa menghapus header dengan df lalu | tr -dc '0-9'
Saya berdiri dikoreksi, saya tidak dapat menemukan saklar untuk menghapus header dari df.
Saya telah membaca halaman manual, dan halaman info dan tidak dapat menemukannya juga @ bc2946088, teriakan yang baik untuk dipertimbangkan tr, saya mendapatkan kepalaku berantakan dengan ide-ide sed dan awk.
Arronical
3
Saya telah mencari untuk menghapus opsi tajuk juga. Pada dasarnya pengembang GNU enggan menerapkannya. Ada permintaan fitur, dan mereka hanya mengatakan tidak.
Sergiy Kolodyazhnyy

Jawaban:

19

Saya akan menggunakan ...

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

Tidak yakin apakah sed lebih cepat, tetapi saya tidak bisa mengingat nilai sed.

muru
sumber
1
Menggunakan timeuntuk mengujinya keluar sama cepatnya dengan sed.
Arronical
4
@Arronical kecuali output Anda waaaaaaaaaaaay lebih besar dari 100%, saya ragu Anda akan melihat banyak perbedaan. : P
muru
@Arronical What muru berkata; waktu doa kemungkinan akan mendominasi.
CVn
1
Dalam hal ini, trlebih mudah dibaca daripada sed.
Paddy Landau
7

Inilah solusi awk:

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

Pada dasarnya yang terjadi di sini adalah kita memperlakukan karakter '%' sebagai pemisah bidang (pembatas kolom), dan mencetak kolom pertama $ 1 hanya ketika jumlah catatan sama dengan dua ( NR==2bagian)

Jika kami ingin menggunakan bashalat-satunya, kami dapat melakukan sesuatu seperti ini:

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

Dan untuk bersenang-senang, alternatif sedmelalui grup tangkap dan -rregex diperpanjang:

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

sed larutan

df --output=pcent /mount/point | sed '1d;s/^ //;s/%//'
  • 1d hapus baris pertama
  • ; untuk memisahkan perintah
  • s/^ // hapus spasi dari awal baris
  • s/%//hapus %tanda
Zanna
sumber
6

Anda dapat menyalurkan ke grepyang baru saja mengekstrak digit:

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

Lihat langsung:

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

Saya menemukan server di mana --output = pcent belum diimplementasikan, jadi saya menggunakan output normal, difilter menurut kolom, diikuti oleh regex: df /mount/point | awk '{print $5}' | tr -dc '0-9'

Ramon Fincken
sumber
1
Anda harus menambahkan -P atau --portabilitas ke df; lain jika titik / mount / terlalu lama akan terputus dan Anda mendapatkan nilai yang salah.
SvennD
1

Solusi dua langkah Bash

Menjadi penggemar agak bash (Borne Again SHell) tahun lalu saya pikir saya akan mengusulkan solusi menggunakannya.

$ DF_PCT=$(df --output=pcent /mnt/d)
$ echo ${DF_PCT//[!0-9]/}
5
  • Baris 1 menangkap dfkeluaran ke variabel DF_PCT.
  • Baris 2 menghapus semua yang bukan digit DF_PCTdan menampilkannya di layar.
  • Keuntungan daripada jawaban yang diterima adalah umpan baris setelah persentase ( 5dalam hal ini) dihasilkan.
WinEunuuchs2Unix
sumber
1

Ini solusi lain:

df | grep /mount/point | awk '{ print $5 }' | cut -d'%' -f1
Feriman
sumber