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.