Output del comando 'watch' come elenco


27

Voglio fare un semplice calcolo del numero di righe al minuto aggiunte a un file di registro.

Voglio anche memorizzare il conteggio per ogni secondo.

Ciò di cui ho bisogno è l'output del seguente comando come elenco che verrà aggiornato ogni secondo:

watch -n1 'wc -l my.log'

Come emettere "update" del comando "watch" come elenco?

Risposte:


24

È possibile utilizzare l' -topzione su watchcui non stampa l'intestazione. Tuttavia, ciò cancellerà comunque lo schermo, quindi potresti stare meglio con un semplice loop di shell:

while sleep 1; do
    wc -l my.log
done

Uno dei vantaggi è che puoi facilmente aggiungere altri comandi (ad es. date) E / o reindirizzare l'output sedper riformattarlo. A proposito, se si scambia sleep 1con wcnel ciclo, terminerà automaticamente in caso di errori.


Tuttavia nota che non lo farà esattamente ogni secondo (con zsh o ksh93, potresti regolare il tempo di sonno in modo da tenere conto della deriva sostenuta dall'esecuzione dei comandi nel ciclo, però)
Stéphane Chazelas,

2
@StephaneChazelas non lo farà nemmeno con wait- basta provare watch -n 1 "sleep 5".
peterph,

In effetti (ho verificato sia le implementazioni procps che busybox). Ho pensato che fosse l'unica cosa watchutile, ma non ti dà nemmeno quello, quindi la tua soluzione è valida come quella basata su un orologio, ma non risponde alla domanda "velocità con cui cresce un file di registro" con grande precisione.
Stéphane Chazelas,

Bene, se le linee al minuto sono l'obiettivo finale, quindi campionarlo una volta ogni 10 secondi è più che sufficiente imho - quindi l'overhead non è così terribile (a meno che il file non diventi davvero grande, ovviamente). E in realtà all'interno del ciclo, è possibile stampare le informazioni di temporizzazione (anche prima e dopo il termine del comando se necessario), quindi l'accuratezza può migliorare (ordini di grandezza) anche per file più grandi.
peterph,

1
@peterph watchha -pun'opzione che lo farà nel modo giusto, se possibile (ovviamente, non puoi fare un comando che richiede 5 secondi ogni 1 secondo, se non ti è permesso più simultaneamente). Lo so, l'ho scritto :-P
derobert

8

Una vecchia domanda, ma ho appena trovato una risposta molto semplice:

watch -n1 'wc -l my.log | tee -a statistics.log'

Questo eseguirà wcogni secondo, aggiungerà il suo output al file statistics.log e lo mostrerà anche sullo schermo.
Quindi, finirai con un file pieno di numeri, che rappresentano il numero successivo di righe di my.log.


Si noti che questo comando watch "($MYCMD | tee -a $MYLOG)"non lo è watch "($MYCMD)" | tee -a $MYLOG. Se hai sbagliato come ho fatto io, l'output sarà molto confuso. Un'altra cosa da notare qui è che questo comando non aggiunge la data / ora dell'esecuzione di ciascun comando per impostazione predefinita, quindi la risposta con il ciclo potrebbe ancora funzionare meglio per te.
Sfogliando il


3

Prova quanto segue:

watch -n1 'wc -l my.log >> statistics.log'

1

Mi sono imbattuto in questa domanda quando stavo cercando di ottenere un output migliore / registrato du -sh $data_path. Ho usato il modello "while command, do sleep" trovato qui, ma ho usato alcuni AWK complessi per dare l'output che volevo.

while du -sh $data_path; do sleep 1; done | awk '
$1 != size {
    size=$1;
    path=$2;
    time=systime();
    seconds=time-prevtime;
    if(seconds < 1000000000){
        seconds=seconds" seconds"
    }else{
        seconds=""
    }
    print size, path, strftime("%m/%d/%Y@%H:%M:%S", time), seconds; 
    prevtime=time
}'

In realtà l'ho fatto come oneliner, motivo per cui ci sono punti e virgola. Ma per renderlo leggibile, l'ho scoppiato. L'output è simile a:

502G /var/lib/cassandra/dump/ 05/22/2018@04:46:17
503G /var/lib/cassandra/dump/ 05/22/2018@04:46:59 42 seconds
504G /var/lib/cassandra/dump/ 05/22/2018@04:47:57 58 seconds
505G /var/lib/cassandra/dump/ 05/22/2018@04:48:55 58 seconds
506G /var/lib/cassandra/dump/ 05/22/2018@04:49:53 58 seconds
507G /var/lib/cassandra/dump/ 05/22/2018@04:50:50 57 seconds
508G /var/lib/cassandra/dump/ 05/22/2018@04:51:46 56 seconds
509G /var/lib/cassandra/dump/ 05/22/2018@04:52:44 58 seconds
510G /var/lib/cassandra/dump/ 05/22/2018@04:53:41 57 seconds

0

Potresti creare uno script che lo faccia per te. Ho chiamato il mio keep(tipo, continua a farlo) e l'ho messo sul binpercorso.

Questa è la mia sceneggiatura:

#!/bin/bash
echo "Repeating command $* every second"
while sleep 1; do
    "$@"
done

1
È necessario utilizzare "$@"per eseguire il comando (argomenti) anziché non quotato $*. In questo modo la shell manterrà gli argomenti tra virgolette, ecc. Come l'utente li aspetterebbe. FTFY.
roaima,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.