View Full Version : problema con grep e top
Ciao a tutti,
devo scrivere uno scriptino che ogni tot secondi scriva in un file l'ora corrente e l'uso di cpu
se scrivo
top | grep Cpu
mi stampa sta roba
Cpu(s): 0.1%us, 0.1%sy, 0.0%ni, 98.5%id, 1.0%wa, 0.0%hi, 0.2%si, 0.0%st
a me serve solo il primo valore, quindi aggiungo un cut dopo in sto modo
top | grep Cpu | cut -b 10-14
ma così non mi stampa più nulla! dove sbaglio??
Gimli[2BV!2B]
02-09-2009, 20:52
w -u | cut -sd, -f4,6,8
Esempio di output:gimli@altarf:~$ w -u | cut -sd, -f4,6,8
03,15,16
03 = carico percentuale medio dell'ultimo minuto (-f4)
15 = carico percentuale medio degli ultimi 5 minuti (-f6)
16 = carico percentuale medio degli ultimi 15 minuti (-f8)
dell'ultimo minuto? perchè a me servirebbe il carico ogni 5 secondi
cmq grazie mille!
no, ma non mi va bene il valore medio... devo proprio lavorare su top perchè devo prendere la percentuale corrente di uso di cpu da parte dello user
con questo comando prendo l'ora
[code]
top -n 1 | grep average | cut -c 20-28
[/code]
c'è un modo per prendere sempre con un comando solo anche la terza riga, cioè quella dei timings di cpu che effettivamente mi interessano?
devo avere come risultato un file del genere
22:31:46 0.0
22:31:51 22.7
22:31:56 34.9
22:32:01 20.4
22:32:06 20.1
22:32:11 21.7
22:32:16 21.2
22:32:21 20.8
22:32:26 18.8
22:32:31 21.0
22:32:36 21.1
22:32:41 17.6
cioè l'orario e il tempo di cpu associato...
solo che se lo faccio con 2 grep separati mi andrebbe a capo ogni riga ottentendo una roba del genere, che non mi va bene purtroppo
22:31:46
0.0
22:31:51
22.7
22:31:56
34.9
22:32:01
20.4
22:32:06
20.1
22:32:11
21.7
22:32:16
21.2
22:32:21
20.8
22:32:26
18.8
22:32:31
21.0
22:32:36
21.1
22:32:41
17.6
Gimli[2BV!2B]
02-09-2009, 23:05
Uff, che pignolo! :)
Così potrebbe andare?
echo 100 - `top -d0 -n1 | sed -e '/^Cpu(s):/!d' -e 's/.*ni,[^\ ]*//' -e 's/%.*$//'` | bc
Prende la percentuale di idle, dopodiché calcola 100 - $idle.
Psycotic
03-09-2009, 09:59
echo "`date +%H:%M:%S` `top -n1|grep Cpu|awk '{print $2}'|sed s/,//g`"
grazie mille per l'aiuto che mi state dando :)
i 2 comandi che mi avete dato sembrano funzionare molto bene, ma se li lanciate "a mano" a distanza di 5 secondi, il valore di cpu che vi stampa a voi cambia??
perchè a me rimane sempre lo stesso, anche se lo lancio 15 volte di seguito :stordita:
Psycotic
03-09-2009, 14:04
che devo dire, in vita mia non ero mai accorto di sta cosa..
Il top nella prima paginata dice c....ate, hai ragione!
Psycotic
03-09-2009, 14:20
in alternativa potresti provare un tool per statistiche come il sar.
Oppure puoi fare 2 pagine di top e poi prendere solo la seconda pagina.
Una cosa cosi':
echo "`date +%H:%M:%S` `top -n2|grep Cpu|awk '{print $2}'|sed s/,//g|tail -1`"
argh! speravo di averla scampata usando sar... ma al mio prof non va bene...
mannaggia a me che non so usare le espressioni regolari... ora tento di studiarmele ben bene
sar -u 4 5 restituisce i dati con questa sintassi (il 4 sta per 4 secondi tra una iterazione e l'altra, il 5 per il numero di iterazioni da fare)
Linux 2.6.27.5 (specweb_web) 09/13/2009
08:36:20 PM CPU %user %nice %system %iowait %steal %idle
08:36:24 PM all 2.74 0.00 0.25 0.00 0.00 97.01
08:36:28 PM all 0.75 0.00 0.25 0.00 0.00 99.00
08:36:32 PM all 3.00 0.00 0.75 0.00 0.00 96.25
08:36:36 PM all 0.00 0.00 0.25 2.00 0.00 97.76
08:36:40 PM all 0.00 0.00 0.00 0.00 0.00 100.00
Average: all 1.30 0.00 0.30 0.40 0.00 98.00
a me serve il tempo e la somma di user+system in un file
mentre in un altro mi serve il tempo e la iowait
al momento non ho proprio idea di come si faccia lol
ok con
echo "`sar -u 2 4|grep M|awk '{print $1 $4+$6}'|sed 1d`"
mi sono avvicinato a quello che mi serve... ora... come diavolo faccio a mettere lo spazio tra $1 e $4+$6??
così mi stampa
10:03:231
10:03:254.52
10:03:270
10:03:294.5
al posto di
10:03:23 1
10:03:25 4.52
10:03:27 0
10:03:29 4.5
Gimli[2BV!2B]
14-09-2009, 00:35
sar -u 2 4 | awk '/AM|PM/{ if(FNR>3) print $1" "$2" "$4+$6}'
/AM|PM/ sostituisce il grep ed è più "preciso" (| in mezzo funge da OR tra le due stringhe).
if(FNR>3) salta fino alla terza riga.
" " è il famoso spazio.
echo non serve, se l'hai tenuto dal mio precedente esempio serviva solo per bc.
Gli "" esterni forzano il tutto ad una stringa, non sono indispensabili, salvo inserimento in variabili di command substitution con output contenenti spazi.
Command substitution (http://tldp.org/LDP/abs/html/commandsub.html): gli `` esterni dicono a bash/sh di mettere in quel punto l'output del comando contenuto (cosa che accade anche senza), oltretutto invocando una subshell.
grazie mille!!
mi sono accorto di una cosa... sar visualizza solo PM, se l'ora è minore di 12 non visualizza AM
in ogni caso non mi interessa che stampi anche average, quindi mi può bastare
sar -u 2 4 | awk '{ if(FNR>3) print $1" "$4+$6}'
ripeto, grazie mille per l'aiuto!!
mannaggia a sar...
purtroppo il fatto del PM/AM è un bug bello grosso...
se l'ora è minore di 12 come ho detto prima, non viene stampato AM, quindi i campi che mi interessa sommare sono $3 e $5
se invece l'ora è maggiore di 12 viene stampato PM, quindi i dati che devo sommare diventano il $3 e il $6!!! mannaggia come posso fare??
edit: risolto con sed s/PM//
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.