Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

awk

1 view
Skip to first unread message

nameci

unread,
Nov 24, 2009, 10:26:45 AM11/24/09
to
Ragazzi,
e' una stupidata non bloccante ma non riesco a fare tutto in un unica
istruzione awk, e devo ricorrere a sed e tr, e ci sto impazzendo.
Mi date una mano

top -b -n 1|awk '{if($1=="Cpu(s):"){user=$2; sys=$3; ni=$4; id=$5; wa=$6;
hi=$7; si=$8; st=$9; print user sys ni id wa hi si st}}'|sed
'~s/[a-z%]*//g'|tr ',' ' '

Grazie

Ps. ho usato le variabili perche' cercavo di manipolarle prima di stamparle.
Ovviamente per il risultato attuale non servono

--
************** (.)_(.) *******************
Un amico � uno che sa tutto di te e,
nonostante questo, gli piaci
(E. Hobbard)

antani

unread,
Nov 24, 2009, 10:46:30 AM11/24/09
to
nameci wrote:

> Ragazzi,
> e' una stupidata non bloccante ma non riesco a fare tutto in un unica
> istruzione awk, e devo ricorrere a sed e tr, e ci sto impazzendo.
> Mi date una mano
>
> top -b -n 1|awk '{if($1=="Cpu(s):"){user=$2; sys=$3; ni=$4; id=$5; wa=$6;
> hi=$7; si=$8; st=$9; print user sys ni id wa hi si st}}'|sed
> '~s/[a-z%]*//g'|tr ',' ' '

La sfera di cristallo dice

top -b -n1 | \
awk '$1=="Cpu(s):" {
t=s=""
for(i=2;i<=9;i++){sub(/%.*/,"",$i);t=t s $i;s=OFS}
print t
}'

nameci

unread,
Nov 24, 2009, 10:57:35 AM11/24/09
to
>antani" <ant...@mail.not> ha scritto nel messaggio
>news:hegv4n$22b$1...@news.eternal-september.org...

> for(i=2;i<=9;i++){sub(/%.*/,"",$i);t=t s $i;s=OFS}

questa me la devo proprio studiare
Grazie

Giacomo Boffi

unread,
Nov 25, 2009, 8:55:15 AM11/25/09
to
"nameci" <nospam4...@alice.it> writes:

> top -b -n 1 | awk '{if($1=="Cpu(s):"){
> user=$2; sys=$3; ni=$4; id=$5; wa=$6; hi=$7; si=$8; st=$9;
> print user sys ni id wa hi si st}}' | \
> sed '~s/[a-z%]*//g' | \
> tr ',' ' '


% top -b -n 1 | awk -F"[ ()a-zA-Z,:%]+" '
/^Cpu.s.:/ {for(i=1;i<NF;i++) printf $i" "; print ""}'
4.2 0.7 0.1 94.8 0.1 0.0 0.0 0.0
%

nameci

unread,
Nov 25, 2009, 9:11:58 AM11/25/09
to
"Giacomo Boffi" <giacom...@polimi.it> ha scritto nel messaggio
news:86hbsi7...@aiuole.stru.polimi.it...

> "nameci" <nospam4...@alice.it> writes:
> % top -b -n 1 | awk -F"[ ()a-zA-Z,:%]+" '
> /^Cpu.s.:/ {for(i=1;i<NF;i++) printf $i" "; print ""}'
> 4.2 0.7 0.1 94.8 0.1 0.0 0.0 0.0


Avete proprio deciso di umiliarmi eh? :-)
Sono riuscito a capire quella proposta da antani, adesso mi studio anche la
tua.
Grazie

Giacomo Boffi

unread,
Nov 26, 2009, 6:58:45 AM11/26/09
to
"nameci" <nospam4...@alice.it> writes:

> "Giacomo Boffi" <giacom...@polimi.it> ha scritto nel messaggio
> news:86hbsi7...@aiuole.stru.polimi.it...
>> "nameci" <nospam4...@alice.it> writes:
>> % top -b -n 1 | awk -F"[ ()a-zA-Z,:%]+" '
>> /^Cpu.s.:/ {for(i=1;i<NF;i++) printf $i" "; print ""}'
>> 4.2 0.7 0.1 94.8 0.1 0.0 0.0 0.0

> Sono riuscito a capire quella proposta da antani, adesso mi studio
> anche la tua.

in awk il field separator � di default uguale alla regex "[ \t]+"
con l'opzione -F"[ ()a-zA-Z,:%]+" cambi questo default in modo che i
campi siano i numeri decimali sulla tua riga "utile"

il programma dice "quando trovi una riga utile, che inizia con Cpu...,
fai un ciclo sui campi, tranne l'ultimo, e per ogni campo
stampi il suo valore come stringa, concatenato ad uno spazio, ed alla
fine del ciclo stampi un carattere vuoto seguito da un LF"

quello che il programma stampa assomiglia a quanto hai chiesto, in
quanto c'� uno spazio bianco alla fine che non dovrebbe esserci...
ma cos� riesce bello compatto

studiati anche la funzione split e la gsub, puoi risolvere il tuo
problema con ciascuna delle due

per lasciarti qualcosa cui pensare,

% top -b -n 1 | awk -F"[ ()a-zA-Z,:%]+" '/^Cpu.s.:/{NF=NF;print}'
4.6 0.9 0.3 94.2 0.1 0.0 0.0 0.0
%
--
The stories of the street are mine, the Spanish voices laugh.

Radoulov, Dimitre

unread,
Nov 26, 2009, 7:22:45 AM11/26/09
to
On 26/11/2009 12.58, Giacomo Boffi wrote:
> "nameci"<nospam4...@alice.it> writes:
>
>> "Giacomo Boffi"<giacom...@polimi.it> ha scritto nel messaggio
>> news:86hbsi7...@aiuole.stru.polimi.it...
>>> "nameci"<nospam4...@alice.it> writes:
>>> % top -b -n 1 | awk -F"[ ()a-zA-Z,:%]+" '
>>> /^Cpu.s.:/ {for(i=1;i<NF;i++) printf $i" "; print ""}'
>>> 4.2 0.7 0.1 94.8 0.1 0.0 0.0 0.0
[...]

> per lasciarti qualcosa cui pensare,
>
> % top -b -n 1 | awk -F"[ ()a-zA-Z,:%]+" '/^Cpu.s.:/{NF=NF;print}'
> 4.6 0.9 0.3 94.2 0.1 0.0 0.0 0.0


Oppure:

top -bn1|awk '/^Cpu/&&gsub(/[^0-9. ]/,x)'

o

perl -e'
/^Cpu/and print/[\d\s.]+/g for qx(top -bn1)
'


Dimitre

nameci

unread,
Nov 26, 2009, 7:48:10 AM11/26/09
to
"Giacomo Boffi" <giacom...@polimi.it> ha scritto nel messaggio
news:86bpip5...@aiuole.stru.polimi.it...
>[CUT]

> studiati anche la funzione split e la gsub, puoi risolvere il tuo
> problema con ciascuna delle due

Grazie delle spiegazioni precise che mi hanno confermato quanto da me
interpretato.
Ho visto che awk ha delle funzioni interne tra le quali quelle che mi
indichi. E' un modo da esplorare :-)

> per lasciarti qualcosa cui pensare,
>
> % top -b -n 1 | awk -F"[ ()a-zA-Z,:%]+" '/^Cpu.s.:/{NF=NF;print}'
> 4.6 0.9 0.3 94.2 0.1 0.0 0.0 0.0
> %

:-)
O caspita.
Cosa fa? Un ciclo implicito sui campi assegnando il numero dei campi letti
alla variabile d'ambiente NF attualizzando ad ogni ciclo la variabile come
definitiva in modo che per la print ad ogni ciclo l'ultimo campo della
stringa risulta quello correntemente in elaborazione e lo stampa?

Radoulov, Dimitre

unread,
Nov 26, 2009, 8:49:06 AM11/26/09
to
On 26/11/2009 13.48, nameci wrote:
> "Giacomo Boffi" <giacom...@polimi.it> ha scritto nel messaggio
> news:86bpip5...@aiuole.stru.polimi.it...
[...]

>> per lasciarti qualcosa cui pensare,
>>
>> % top -b -n 1 | awk -F"[ ()a-zA-Z,:%]+" '/^Cpu.s.:/{NF=NF;print}'
>> 4.6 0.9 0.3 94.2 0.1 0.0 0.0 0.0
>> %
>
> :-)
> O caspita.
> Cosa fa? Un ciclo implicito sui campi assegnando il numero dei campi
> letti alla variabile d'ambiente NF attualizzando ad ogni ciclo la
> variabile come definitiva in modo che per la print ad ogni ciclo
> l'ultimo campo della stringa risulta quello correntemente in
> elaborazione e lo stampa?

No,
definisce come field separator il range di caratteri indicato tra [ e ]
dopodich� "forza" la ricostruzione del current record assegnando alla
variable interna (non d' ambiente) NF il suo valore inalterato.

In altre parole:

top -bn1|awk -F'[^0-9. ]' '/^Cpu/&&NF=NF' OFS=

Dimitre

nameci

unread,
Nov 26, 2009, 9:10:31 AM11/26/09
to
"Radoulov, Dimitre" <cicho...@gmail.com> ha scritto nel messaggio
news:hem10o$n1g$1...@news.eternal-september.org...

> No,
> definisce come field separator il range di caratteri indicato tra [ e ]

Si questo l'avevo capito anche perche' l'aveva usato nell'esempio precedente

> dopodich� "forza" la ricostruzione del current record assegnando alla
> variable interna (non d' ambiente) NF

Chiedo venia per il termine inappropriato.

> NF il suo valore inalterato.

Come inalterato? Inserisce il campo privato dei carateri di separazione. No?

> top -bn1|awk -F'[^0-9. ]' '/^Cpu/&&NF=NF' OFS=

Si va bene, quanto a fondo nella ferita volete spingere questo coltello? :-(

Allora indichi i separato come i caratteri che voglio estrarre e
ricostruisci la variabile interna (imparo velocemente :-) ) NF con la nuova
composizione del campo (cioe' con i soli caratteri che mi interessano) e
imposti a null il separatore di campi.

Come sono andato?
Ciao

Giacomo Boffi

unread,
Nov 26, 2009, 9:16:33 AM11/26/09
to
"nameci" <nospam4...@alice.it> writes:

> O caspita. Cosa fa?

a questo ti ha gi� risposto Dimitre...

se lo trovi "The AWK Programming Language" di Aho Weinberger e
Kernigan � un libretto che chi non ha un'educazione formale
sull'informatica pu� leggere con profitto, imvho, superiore alla sola
conoscenza di awk

ciao
--
"It will be rain tonight."
"Let it come down."

nameci

unread,
Nov 26, 2009, 9:19:18 AM11/26/09
to
"Giacomo Boffi" <giacom...@polimi.it> ha scritto nel messaggio
news:867htd5...@aiuole.stru.polimi.it...

> se lo trovi "The AWK Programming Language" di Aho Weinberger e
> Kernigan

lo inserisco nei prossimi acquisti natalizi :-)

>� un libretto che chi non ha un'educazione formale

ehi non sono messo cosi' male :-)

Ciao

Radoulov, Dimitre

unread,
Nov 26, 2009, 9:25:07 AM11/26/09
to
On 26/11/2009 15.10, nameci wrote:
> "Radoulov, Dimitre" <cicho...@gmail.com> ha scritto nel messaggio
> news:hem10o$n1g$1...@news.eternal-september.org...
[...]

>> NF il suo valore inalterato.
>
> Come inalterato? Inserisce il campo privato dei carateri di separazione.
> No?

No,
NF � number of fields in the current record e in questo caso �
inalterato (non abbiamo cambiato il numero di campi, abbiamo solo
definito il loro contenuto).

Abbiamo fatto:

% print {1..5}\
1 2 3 4 5
% print {1..5}\ | awk NF=NF
1 2 3 4 5

Non:

% print {1..5}\ | awk NF--
1 2 3 4


>> top -bn1|awk -F'[^0-9. ]' '/^Cpu/&&NF=NF' OFS=
>
> Si va bene, quanto a fondo nella ferita volete spingere questo coltello?
> :-(
>
> Allora indichi i separato come i caratteri che voglio estrarre e
> ricostruisci la variabile interna (imparo velocemente :-) ) NF con la
> nuova composizione del campo (cioe' con i soli caratteri che mi
> interessano) e imposti a null il separatore di campi.

Pi� precisamente definisci il separatore e fai in modo che AWK
ricostruisca/ricompili il record corrente utilizzando il valore di OFS.
La ricostruzione/ricompilazione in questo caso � provocata dalla
assegnazione di un valore (qualsiasi, in questo caso il valore corrente)
alla variabile interna NF.

Nel esempio seguente utilizzo la variabile $1 per ottenere lo stesso
comportamento:

% print {1..5}.
1. 2. 3. 4. 5.
% print {1..5}.|awk -F. '$1=$1'
1 2 3 4 5
% print {1..5}.|awk -F. '$1=$1' OFS=+
1+ 2+ 3+ 4+ 5+


Dimitre

Giacomo Boffi

unread,
Nov 27, 2009, 7:36:33 AM11/27/09
to
"nameci" <nospam4...@alice.it> writes:

> "Giacomo Boffi" <giacom...@polimi.it> ha scritto nel messaggio
> news:867htd5...@aiuole.stru.polimi.it...
>> se lo trovi "The AWK Programming Language" di Aho Weinberger e
>> Kernigan
>
> lo inserisco nei prossimi acquisti natalizi :-)

� straordinariamente caro...


>>� un libretto che chi non ha un'educazione formale
> ehi non sono messo cosi' male :-)

allora sei fortunato, perch� lo trovi in biblioteca
--
"Lord, what fools these mortals be!"

nameci

unread,
Nov 27, 2009, 8:27:55 AM11/27/09
to
"Giacomo Boffi" <giacom...@polimi.it> ha scritto nel messaggio
news:86eink4...@aiuole.stru.polimi.it...

> "nameci" <nospam4...@alice.it> writes:
>
>> "Giacomo Boffi" <giacom...@polimi.it> ha scritto nel messaggio
>> news:867htd5...@aiuole.stru.polimi.it...
>>> se lo trovi "The AWK Programming Language" di Aho Weinberger e
>>> Kernigan
>>
>> lo inserisco nei prossimi acquisti natalizi :-)
>
> � straordinariamente caro...


Argh!!! 93 dollari. Ok scherzavo, me lo faccio raccontare :-)

Radoulov, Dimitre

unread,
Nov 27, 2009, 8:53:08 AM11/27/09
to
On 27/11/2009 14.27, nameci wrote:
> "Giacomo Boffi" <giacom...@polimi.it> ha scritto nel messaggio
> news:86eink4...@aiuole.stru.polimi.it...
>> "nameci" <nospam4...@alice.it> writes:
>>
>>> "Giacomo Boffi" <giacom...@polimi.it> ha scritto nel messaggio
>>> news:867htd5...@aiuole.stru.polimi.it...
>>>> se lo trovi "The AWK Programming Language" di Aho Weinberger e
>>>> Kernigan
>>>
>>> lo inserisco nei prossimi acquisti natalizi :-)
>>
>> � straordinariamente caro...
>
>
> Argh!!! 93 dollari. Ok scherzavo, me lo faccio raccontare :-)

Se posso dire la mia,
il primo libro che suggerisco sempre � Gawk: Effective AWK Programming
di Arnold Robbins (current GNU AWK maintainer).
Ci sono sia la versione gratuita di FSF (gnu.org/manual/gawk/) che
quella a pagamento (tinyurl.com/yhphcpr).

Invece The AWK Programming Language la trovi anche usata su Amazon al
prezzo di $5.97 + le spese di spedizione (tinyurl.com/ycgu6rw).


Dimitre

nameci

unread,
Nov 27, 2009, 9:25:14 AM11/27/09
to
"Radoulov, Dimitre" <cicho...@gmail.com> ha scritto nel messaggio
news:heolkd$h52$1...@news.eternal-september.org...

> Se posso dire la mia,


Di questo tipo e' sempre ben accetta ;-)

0 new messages