'Watch' komutunun liste halinde çıktısı


27

Bir günlük dosyasına eklenen dakika başına satır sayısının basit bir hesaplama yapmak istiyorum.

Ayrıca her saniye için sayımı saklamak istiyorum.

İhtiyacım olan, aşağıdaki komutun her saniye güncellenecek bir liste çıktısı:

watch -n1 'wc -l my.log'

'İzle' komutunun 'güncellemesini' liste halinde nasıl verir?

Yanıtlar:


24

Üstbilgi yazdırmamasına neden olan -tanahtarı kullanabilirsiniz watch. Ancak, bu hala ekranı temizleyecektir, böylece basit bir kabuk döngüsü ile daha iyi olabilirsiniz:

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

Avantajlarından biri, kolayca başka komutlar ekleyebilmeniz (örneğin date) ve / veya çıktıyı sedyeniden biçimlendirmek için kullanabilmenizdir. Eğer takas arada, eğer sleep 1ile wcdöngü içinde, otomatik olarak hatalarda feshedilecektir.


Ancak bunu tam olarak her saniye yapmayacağını unutmayın (zsh veya ksh93 ile uyku
modunu

2
@StephaneChazelas ile de olmaz wait- sadece deneyin watch -n 1 "sleep 5".
peterph

Gerçekten (Hem procps hem de busybox uygulamalarını kontrol ettim). Bunun tek watchişe yarar olduğunu düşündüm , ama çözümün saat temelli olduğu kadar iyi olmasa da size vermedi, ancak hiçbiri "bir günlük dosyasının büyüdüğü hızda" sorusuna büyük bir doğrulukla cevap vermiyor .
Stéphane Chazelas

Eh, eğer dakikadaki satırlar nihai hedefse, o zaman her 10 saniyede bir örnekleme yapmak yeteriden fazladır - bu nedenle genel gider o kadar da kötü değildir (dosya elbette çok büyüyünce). Ve aslında döngünün içinden bir kişi zamanlama bilgisini yazdırabilir (gerekirse komut tamamlanmadan önce ve sonra bile) ve sonra daha büyük dosyalar için bile doğruluk daha iyi olabilir (büyüklük dereceleri).
Peterph

1
@peterph , eğer mümkünse, bunu doğru yapacak watchbir -pseçeneğe sahiptir (tabii ki, aynı anda birden fazla izin verilmezse, her 1 saniyede 5 saniye süren bir komutu yapamazsınız). Biliyorum, yazdım :-P
derobert

8

Eski bir soru, ama çok kolay bir cevap buldum:

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

Bu, wcher saniyenizi yürütecek , çıktısını statistics.log dosyasına ekleyecek ve ekranda gösterecektir.
Böylece, ardışık satır sayısını temsil eden sayılarla dolu bir dosya elde edersiniz my.log.


Lütfen bu komutun watch "($MYCMD | tee -a $MYLOG)"olmadığını unutmayın watch "($MYCMD)" | tee -a $MYLOG. Benim yaptığım gibi yanlış anladıysanız, çıktı çok kafa karıştırıcı olacak. Burada dikkat edilmesi gereken bir başka şey de, bu komutun varsayılan olarak her komutun yürütmesinin zaman damgasını eklememesidir, bu nedenle döngüdeki cevap hala sizin için daha iyi çalışabilir.
Ağustos’ta


3

Takip etmeyi dene:

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

1

Daha iyi / kayıtlı çıktılar almaya çalışırken bu soruyla karşılaştım du -sh $data_path. Burada bulunan "while komutunu uyu" şablonunu kullandım, ancak istediğim çıktıyı vermek için bazı karmaşık AWK kullandım.

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

Aslında bunu oneliner olarak yaptım, bu yüzden noktalı virgül var. Ama okunabilir hale getirmek için, onu kırdım. Çıktı şöyle görünür:

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

Bunu sizin için yapan bir script oluşturabilirsiniz. Benimkini aradım keep(yapmayı sürdürdüm) ve binyola koydum .

Bu benim senaryom:

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

1
"$@"Alıntılama yerine komutu (argümanlar) çalıştırmak için kullanmalısınız $*. Bu şekilde, kullanıcının beklediği gibi kabuktan alıntılar vb. FTFY.
roaima
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.