Cara mendapatkan substring dari perintah bash

8

Diberikan substring berikut yang diberikan dari perintah df /dev/sdb1 | tail -n 1:

/dev/sdb1 1952971772 1441131032 511840740 74% /media/kaiman/ShareData

Saya ingin mengekstrak 1952971772dan 74%dari string itu, untuk menggunakannya dalam skrip bash.

Saya tahu saya bisa menggunakan beberapa perintah cut atau sesuatu, tetapi tidak akan berfungsi lagi jika ukurannya berubah, misalnya.

Saya juga memiliki pemikiran tentang menggunakan regex atau sesuatu, tetapi saya ingin memiliki pendekatan yang paling direkomendasikan.

Terima kasih sebelumnya!

Nicolas DUVOISIN
sumber
2
Apakah Anda bertanya tentang kasus umum, atau tentang dfkhususnya? Jika yang terakhir, Anda dapat menentukan bidang output tertentu secara eksplisit misalnyadf --output=pcent /dev/sdb1
steeldriver
2
Anda menggunakan cutposisi karakter on line yang membuatnya gagal ketika panjang garis berubah dengan fluktuasi ukuran file. Saya percaya Anda dapat memberitahu cutuntuk memilih kolom 2dan kolom yang 5digambarkan oleh spasi tetapi saya sedang menelepon dan tidak dapat meneliti dan memposting jawaban secara efektif.
WinEunuuchs2Unix
1
@ WinEunuuchs2Unix Jumlah ruang dapat bervariasi, jadi sulit untuk menentukan nomor kolom mana yang benar. cutakan melihat satu kolom setelah setiap pembatas.
mook765
Dua atau lebih ruang yang berdekatan masih dihitung sebagai satu ruang untuk menggambarkan kolom, saya pikir
WinEunuuchs2Unix
@ WinEunuuchs2Unix benar :) Saya perintah dari file teks yang saya miliki: D
Rinzwind

Jawaban:

6
$ df /dev/sdb1 | awk '{ print $5 }' | tail -n 1

untuk persentase dan

$ df /dev/sdb1 | awk '{ print $2 }' | tail -n 1

untuk ukuran.

Tanpa tail:

df /home | awk 'NR==2 { print $2 }'
df /home | awk 'NR==2 { print $5 }'

  • awk '{ print $2 }'
    mendapatkan kolom ke-2 di mana banyak pemisah dihitung sebagai 1. Jadi kolom ke-2 selalu sama untuk sistem Anda untuk bagian pertama dari perintah.

  • NR memberi Anda jumlah total catatan yang sedang diproses atau nomor baris.

Rinzwind
sumber
1
Atau jika Anda membutuhkan keduanya dalam satu baris df /home | awk '{print $2; print $5;}'.
Videonauth
3
Awk menyimpan baris terakhir di ENDblok jadi alih-alih menggunakan tailhanya gunakanawk 'END { print $2,$5}'
Kevin
FYI nama saya menjatuhkan Anda di Meta :) meta.askubuntu.com/questions/18584/…
WinEunuuchs2Unix
8

Jawaban yang diedit

Seperti yang dinyatakan @kevin, Anda dapat menggunakan awkuntuk memilih hanya baris terakhir dan menghindari penggunaan ekor sama sekali dengan menggunakan ENDdan juga jika Anda ingin mencetak dua kolom sekaligus Anda dapat melakukan ini:

df /dev/sdb1 | awk 'END {print $2,$5}'
1952971772 74%

Jawaban asli

Anda dapat memilih kolom ke-2 saja:

$ df /dev/sdb1 | tail -1 | awk '{print $2}' 
1952971772

Di mana $2menunjukkan posisi kolom yang dipisahkan TAB. Anda dapat menggunakannya cutkarena hanya menangani satu kemunculan TAB dan di sini ada beberapa TAB untuk membatasi kolom.

noraj
sumber
3
Awk menyimpan baris terakhir di ENDblok jadi alih-alih menggunakan tailhanya gunakanawk 'END { print $2,$5}'
Kevin