On Tuesday 08 January 2008 08:44:25 pm sandman42@xxxxxxxxx wrote:
> Ciao,
>
> mi servirebbe, dato un input di questo tipo (df -h):
>
> Filesystem Size Used Avail Use% Mounted on
> /dev/hda1 225G 48G 167G 23% /
> varrun 760M 152K 759M 1% /var/run
> varlock 760M 0 760M 0% /var/lock
> udev 760M 80K 760M 1% /dev
> devshm 760M 0 760M 0% /dev/shm
> lrm 760M 34M 726M 5%
> /lib/modules/2.6.22-14-generic/volatile /dev/hdb1 73G 65G
> 3.6G 95% /media/disk
>
> ottenere, per la riga che ha un certo pattern (es /dev/hdb1), uno dei
> quattro parametri elencati. Pensavo ad un
>
> df -h | grep hdb1 | sed .....e qui cosa ci metto?
Se non puoi usare awk, ad esempio perchè non è uno dei comandi "essenziali"
del FHS e quindi potrebbe non esserci (mai capitato che ci fosse sed e non
ci fosse awk, ma magari in un contesto embedded chissà) si può usare
df -P | sed -n '/hdb1/ s:^[^ ]* *\([0-9]*\) *\([0-9]*\) *\([0-9]*\)
*\([0-9]*\)%.*$:\2:p'
dove 'df -P' è meglio di 'df -h' in quanto usa il formato di output Posix che
dovrebbe essere meno suscettibile di variazioni del formato "human readable",
che ad esempio può andare a capo se il nome del dispositivo è un device LVM.
Con -n si dice a sed di non stampare automaticamente la riga, perchè ci pensa
il sottocomando p in fondo, indi il primo // seleziona la riga (address
pattern) e il comando s isola tramite le espressioni di grouping \( \) le
espressioni da sostituire che poi possono essere indicate con i backreference
\1, \2 fino a \4.
L'espressione regolare è ... migliorabile, nel senso che ad esempio
\([0-9]*\)
andrebbe più correttamente scritta come
\([0-9][0-9]*\)
perchè voglio sempre almeno una cifra. Ci sono altri casi strani che non ho
affrontato a fondo, per cui non si tratterebbe di una soluzione accettabile
per un contesto di produzione. Ora dovrebbe essere chiaro per quale motivo
esiste awk(1).
Davide Bolcioni
--
There is no place like /home.
|