Newsgroup: it.comp.os.linux.sys
Titolo: qualcuno me lo rispiega?

df /home/|awk '{ sub(/^(.*)system(.*)^M/, ""); print $4 }'
---> "^M" = "Ctrl+V+Invio"
Io non ci ho capito niente.
senza ^M ovviamente stampa la riga vuota.
-- 
echo onailimissaM | awk 'BEGIN { FS = "" }
{ for (i = NF; i >= 1; i-- )
  printf $i }'; echo

 senza ^M ovviamente stampa la riga vuota.
Premesso che
df /home/ | awk '{print $4}'
fa quello che vuoi...
e premesso che invece che ctrl+v+invio puoi mettere \n nell'espressione...
quello che accade e' molto semplice: la prima riga e' una cosa del genere:
"Filesystem           1K-blocks      Used Available Use% Mounted on"
L'espressione regolare /^(.*)system(.*)/ si mangia l'intera riga
(ovviamente), quindi la sub() ha successo e la riga diventa "" (e il quarto
campo della riga e' ovviamente anche lui vuoto)
L'espressione regolare /^(.*)system(.*)\n/ non fa match ($0 non contiene il
\n alla fine della riga), quindi la sub() non ha effetto, la riga rimane
immutata, e il quarto campo della riga e' "Available" come previsto.

 il \n alla fine della riga)
miiinchia che idiota che sono. Hai ragione.
Allora riprendiamo dal post precedente: come faccio a cancellare l'intera 
riga (senza grep e senza sed, e soprattutto, siccome sono un purista, 
senza pipe)?
Allora, questi due funzionano:
df /home/|awk '{ sub(/^(.*)system(.*)$/, ""); print $4 }'
df /home/|awk '{ sub(/(.*)system(.*)/, ""); print $4 }'
però mi lasciano la riga vuota e io invece la voglio cancellare.


 però mi lasciano la riga vuota e io invece la voglio cancellare.
Sostituisci il semplice
print $4
con
if ($4!="") { print $4 }
Non me l'aspettavo da una firma come la tua. ;)
Ciao,
ScriptJus 



Cribbio.... mitico :)


 
Non ho ben capito cosa tu voglia esattamente fare,
immagino saltare la prima riga e processare solo le
righe che iniziano con "/blablabla..."
Se e` cosi`, allora si fa:
df /home | gawk '/^\//{print $4}'
Eventualmente si puo` manipolare l'espressione
regolare iniziale per ottenere risultati diversi.
bye,
-- 
piergiorgio

 Cribbio.... mitico :)
Pero non piace a me, trovo più pulito:
df  | awk 'BEGIN { RS="\n[/|none]" } ; {if (FNR > 1) { print $4 FNR}}'
Spiego usando il mio output come esempio.
Capita che se il mountpoint è troppo lungo (nel mio caso perchè uso lvm), 
che la colonna con i valori numerici venga riportata nella riga successiva.
Ovvero ti trovi con l'output spezzato in due righe, quindi il fine riga non 
corrisponde sempre alla fine della riga di informazioni.
Pertanto usando RS="\n[/|none]", dici ad awk di separare le righe 
considerando (come separatore di record) le fine riga seguite da / oppure da 
none.
Poi, per non stampare la prima riga, puoi semplicemente dirgli stampa se la 
riga non è la prima.
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                      67763800  52269084  12052440  82% /
/dev/sda1               101086     19214     76653  21% /boot
none                   1750364         0   1750364   0% /dev/shm
diventa
12053692
76653
1750364
Awk è veramente potente, consiglio a chi ha voglia di leggersi Sed & Awk 
della O'Reilly.
Ciao,
ScriptJus 

 df /home | gawk '/^\//{print $4}'
questo è un miglioramento della mia espressione:
df /home/ | awk '/home/{print $4}'
ma non è un "grep -v"
in pratica, "sub" ti fa la substition, però non ha l'effetto di 
cancellare la riga.


 della O'Reilly.
e per completare, io consiglio 
http://www.pdfchm.com
 dove ci sono una 
montagna di PDF gratuiti ;)


 df  | awk 'BEGIN { RS="\n[/|none]" } ; {if (FNR > 1) { print $4 FNR}}'
intendevo in realtà:
df  | awk 'BEGIN { RS="\n(none|/)" } ; {if (FNR > 1) { print $4}}'
ma siccome "none" viene escluso (è il separatore),  in quelle righe il campo 
è il terzo.
Quindi due possibilità:
df  | awk 'BEGIN { RS="\n[n/]" } ; {if (FNR > 1) { print $4}}'
df  | awk 'BEGIN { RS="\n(none|/)" } ; {if (FNR > 1) { print $(NF-2)}}'
PS: NF è il numero di campi.
Ciao,
ScriptJus 

 cancellare la riga.
Ovviamente... :-)
bye,
-- 
piergiorgio

 df | tail -n +2 | gawk ...
eh no, avevi fatto così bene fino ad ora :)
comunque... non cercavo una soluzione ad un problema reale. Era più che 
altro una discussione pseudo-accademica, volta anche all'approfondimento 
di awk... che è pur sempre interessante.
p.s.: tra qualche giorno potrei rompervi la scatole con emacs, anche se 
poi nel lavoro di tutti i giorni continuerei ad usare geany e vim :)


 però mi lasciano la riga vuota e io invece la voglio cancellare.
Allora, riassumendo altre cose dagli altri post:
grep -v con awk e'
awk '!/pattern/'
Si', sub() fa la sostituzione, ma non cancella la riga (qualunque cosa
questo significhi). Sei tu che devi evitare di stamparla se non ti
interessa.

 della O'Reilly.
Io consiglio anche "effective awk programming".
Ciao!

 Io consiglio anche "effective awk programming".
Vedro di leggero.
Ciao,
ScriptJus