Output dari perintah 'watch' sebagai daftar

27

Saya ingin melakukan perhitungan sederhana dari jumlah baris per menit yang ditambahkan ke file log.

Saya juga ingin menyimpan hitungan untuk setiap detik.

Yang saya butuhkan adalah output dari perintah berikut sebagai daftar yang akan diperbarui setiap detik:

watch -n1 'wc -l my.log'

Bagaimana cara mengeluarkan 'pembaruan' dari perintah 'tonton' sebagai daftar?

JohnJohnGa
sumber

Jawaban:

24

Anda dapat menggunakan -tsakelar watchyang menyebabkannya tidak mencetak tajuk. Namun, itu masih akan menghapus layar sehingga Anda mungkin lebih baik dengan loop shell sederhana:

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

Salah satu kelebihannya adalah, Anda dapat dengan mudah menambahkan perintah lain (misalnya date) dan / atau menyalurkan output seduntuk memformatnya. Omong-omong, jika Anda bertukar sleep 1dengan wcdalam loop, itu akan secara otomatis berakhir pada kesalahan.

peterph
sumber
Namun, perhatikan bahwa itu tidak akan melakukannya setiap detik (dengan zsh atau ksh93, Anda dapat menyesuaikan waktu tidur untuk memperhitungkan penyimpangan yang terjadi dengan menjalankan perintah dalam loop)
Stéphane Chazelas
2
@StephaneChazelas juga tidak akan wait- coba saja watch -n 1 "sleep 5".
peterph
Memang (saya sudah memeriksa implementasi procps dan busybox). Saya pikir itu adalah satu-satunya hal watchyang berguna, tetapi itu tidak memberi Anda bahkan sehingga solusi Anda sebagus arloji berbasis, tetapi tidak ada yang menjawab pertanyaan "laju pertumbuhan file log" dengan akurasi tinggi.
Stéphane Chazelas
Nah, jika garis per menit adalah tujuan akhir, maka pengambilan sampel setiap 10 detik lebih dari cukup - jadi biaya overhead tidak terlalu buruk (kecuali file tumbuh sangat besar, tentu saja). Dan sebenarnya dari dalam loop, seseorang dapat mencetak informasi waktu (bahkan sebelum dan sesudah perintah selesai jika perlu), dan kemudian keakuratannya dapat menjadi lebih baik (urutan besarnya) bahkan untuk file yang lebih besar.
peterph
1
@peterph watchmemiliki -popsi yang akan melakukannya dengan benar, jika keadaan memungkinkan (jelas, Anda tidak dapat melakukan perintah yang membutuhkan 5 detik setiap 1 detik, jika Anda tidak diizinkan multipel secara bersamaan). Saya tahu, saya menulisnya :-P
derobert
8

Sebuah pertanyaan lama, tetapi saya baru saja menemukan jawaban yang sangat mudah:

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

Ini akan mengeksekusi wcsetiap detik Anda, menambahkan hasilnya ke file stats.log, dan juga memperlihatkannya di layar.
Jadi, Anda akan berakhir dengan file yang diisi dengan angka, mewakili jumlah baris berturut-turut my.log.

Orabîg
sumber
Harap dicatat bahwa perintah ini watch "($MYCMD | tee -a $MYLOG)"bukan watch "($MYCMD)" | tee -a $MYLOG. Jika Anda salah seperti yang saya lakukan, hasilnya akan sangat membingungkan. Satu hal yang perlu diperhatikan di sini adalah bahwa perintah ini tidak menambahkan stempel waktu dari setiap eksekusi perintah secara default, jadi jawaban dengan loop mungkin masih berfungsi lebih baik untuk Anda.
ffledgling
3

Bagaimana tentang

tail -f file.log | pv -rl > /dev/null
Stéphane Chazelas
sumber
3

Coba yang berikut ini:

watch -n1 'wc -l my.log >> statistics.log'
Andy
sumber
1

Saya menemukan pertanyaan ini ketika saya mencoba untuk mendapatkan yang lebih baik / keluaran log dari du -sh $data_path. Saya menggunakan pola "while command, do sleep" yang ditemukan di sini, tetapi menggunakan beberapa AWK yang kompleks untuk memberikan hasil yang saya inginkan.

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

Saya benar-benar melakukan ini sebagai oneliner, itulah sebabnya ada titik koma. Tetapi untuk membuatnya mudah dibaca, saya memecahkannya. Outputnya terlihat seperti:

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
Bruno Bronosky
sumber
0

Anda dapat membuat skrip yang melakukannya untuk Anda. Saya menelepon milik saya keep(seperti, terus melakukannya) dan meletakkannya di binjalan.

Ini skrip saya:

#!/bin/bash
echo "Repeating command $* every second"
while sleep 1; do
    "$@"
done
Alexandre Santos
sumber
1
Anda harus menggunakan "$@"untuk mengeksekusi perintah (argumen) bukan tanda kutip $*. Dengan cara ini Anda akan memiliki shell menyimpan argumen yang dikutip, dll. Seperti yang diharapkan pengguna. FTFY.
roaima