Come ottenere una sottostringa dal comando bash


8

Data la seguente sottostringa fornita ottenuta dal comando df /dev/sdb1 | tail -n 1:

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

Mi piacerebbe estrarre 1952971772e 74%da quella stringa, usarlo in uno script bash.

So che potrei usare alcuni comandi di taglio o qualcosa del genere, ma non funzionerà più se una dimensione cambia, per esempio.

Ho anche pensato di usare una regex o qualcosa del genere, ma mi piacerebbe avere l'approccio più raccomandato.

Grazie in anticipo!


2
Stai chiedendo del caso generale o dfin particolare? In quest'ultimo caso, è possibile specificare esplicitamente determinati campi di output, ad es.df --output=pcent /dev/sdb1
steeldriver

2
Stai usando la cutposizione del carattere sulla linea che lo fa fallire quando la lunghezza della linea cambia con fluttuazioni nella dimensione del file. Credo che tu possa dire cutdi selezionare la colonna 2e la colonna 5delineate dagli spazi, ma sono al telefono e non riesco a effettuare ricerche e a pubblicare una risposta.
WinEunuuchs2Unix

1
@ WinEunuuchs2Unix Il numero di spazi può variare, quindi è difficile stabilire quale numero di colonna sia corretto. cutvedrà una colonna dopo ogni delimitatore.
mook765,

Penso che due o più spazi contigui contino come un unico spazio per delineare le colonne, credo
WinEunuuchs2Unix

@ WinEunuuchs2Unix corretto :) I comandi da un file di testo che ho a portata di mano: D
Rinzwind

Risposte:


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

per la percentuale e

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

per le dimensioni.

Senza il tail:

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

  • awk '{ print $2 }'
    ottiene la seconda colonna dove più separatori contano come 1. Quindi la seconda colonna è sempre la stessa per il tuo sistema per la prima parte del comando.

  • NR ti dà il numero totale di record in elaborazione o il numero di riga.


1
O se hai bisogno di entrambi in una riga df /home | awk '{print $2; print $5;}'.
Videonauth,

3
Awk mantiene l'ultima riga nel ENDblocco, quindi invece di usare tailsoloawk 'END { print $2,$5}'
Kevin

Cordiali saluti, il nome ti ha lasciato cadere su Meta :) meta.askubuntu.com/questions/18584/…
WinEunuuchs2Unix

8

Risposta modificata

Come affermato da @kevin, puoi usare awksolo per selezionare l'ultima riga ed evitare di usare la coda usando ENDe anche se vuoi stampare due colonne contemporaneamente puoi farlo:

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

Risposta originale

È possibile selezionare solo le seconde colonne:

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

Dove $2indica la posizione delle colonne separate TAB. Puoi usarlo cutperché gestisce una sola occorrenza di TAB e qui ci sono TAB multipli per delimitare una colonna.


3
Awk mantiene l'ultima riga nel ENDblocco, quindi invece di usare tailsoloawk 'END { print $2,$5}'
Kevin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.