Newsgroup: it.comp.os.linux.sys
Titolo: awk

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) 

 '~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
}'

  for(i=2;i<=9;i++){sub(/%.*/,"",$i);t=t s $i;s=OFS}
questa me la devo proprio studiare
Grazie


 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
% 

 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


 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.

   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

 %
:-)
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?


 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

 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


 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."

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

 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

 ehi non sono messo cosi' male :-)
allora sei fortunato, perch� lo trovi in biblioteca
-- 
"Lord, what fools these mortals be!"

 � straordinariamente caro...
Argh!!! 93 dollari. Ok scherzavo, me lo faccio raccontare :-)


 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

 Se posso dire la mia,
Di questo tipo e' sempre ben accetta ;-)
