erlug
[Top] [All Lists]

Re: [Erlug] Come tagliare una riga con sed?

To: ERlug - Lista Pubblica <erlug@xxxxxxxxxxxxxx>
Subject: Re: [Erlug] Come tagliare una riga con sed?
From: Davide Bolcioni <db_erlug@xxxxxxxx>
Date: Fri, 11 Jan 2008 22:00:51 +0100
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.

<Prev in Thread] Current Thread [Next in Thread>