tail -f, ancak satır numaralarıyla


21

Uzak bir sunucuda rastgele bir süre içinde kaç kez foo bargöründüğünü görmeye çalışıyorum /var/log/foo.log, ancak şimdiye kadar denediğim hiçbir şey işe yaramadı.

Zaten tailing başladığımdan beri ne kadar zaman geçtiğini takip etmek için kullandığım bir zamanlayıcı betiğim var /var/log/foo.logve şimdi foo barkuyruklu çıktıda kaç kez göründüğünü söylemenin bir yolunu istiyorum .

Google’ı aradım, ancak sonuçların ilk 10 sayfasında uygun bir şey bulamadım.

İşte sinir bozucu sonuçları ile denedim:

## works on local machine, but doesn't work as expected on remote
tail -f /var/log/foo.log | grep foo\ bar | sed '='

## works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | cat -n -

##  works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | awk -F'\n' '{printf "[%d]> ", NR; print $1}'

Öyle davranacak başlı bir senaryo yazmayı bile denedim tail -f, ama bununla sınırlı kaldım.

NOT

uzak sunucu, coreutils'in daha eski bir sürümünü çalıştırıyor ve yükseltme bir seçenektir, ancak istenen herhangi bir şekilde DEĞİLDİR .


2
Hangi şekilde çalışmıyor? --line-bufferedSeçeneğini deneyin grep. Veyatail -f ... | awk '/foo bar/{print ++n, $0}'
Stéphane Chazelas

Neden uzaktan kumandada çalışmıyor? Örnek:tail -f /var/log/log.log | awk '{ printf "[%d]> %s\n", NR+1 ,$0; fflush(stdout); }'

Yanıtlar:


29
tail -f | nl

benim için çalışır ve ilk düşündüğüm şeydir - yani 1 numaralı satırları gerçekten görmek istiyorsanız ve izlenen dosyadaki gerçek satır numarasıyla değil. İsteğe bağlı olarak grepgerekirse uygun bir yere ekleyin (önce veya sonra nl). Ancak, tamponlamanın olabileceğini unutmayın. Benim özel durumda, grepsahip --line-bufferedseçeneği ancak nltamponlar 's çıkışını ve bu kapalı geçiş seçeneği yoktur. Dolayısıyla tail | nl | grepaçılan gerçekten hoş akmıyor.

Bahsedilen,

tail -f | grep -n pattern

benim için de çalışıyor. Numaralandırma, tüm günlük dosyasının başlangıcından ziyade "kuyruk" başlangıcından itibaren tekrar başlar.


Sunucuda çalışan grep sürümünün bir -nseçeneği yoktur.
Alexej Magura

Ancak, uzun seçeneği var --line-number: tail -f /var/log/foo.log | grep foo\ bar --line-numberçalışır!
Alexej Magura

1
Bu ilginç - POSIX'i böyle kontrol etmedim, ancak GNU grep manpage şöyle diyor: -n POSIX tarafından belirtilmiş .
Peterph

16

Bence bu daha iyi.

less -N +F <filepath>

2
Neden daha iyi olduğunu düşündüğünü açıklayabilir misin?
Navigatron

Bu büyük bir düzenleme, geri dönüyorum.
Adam Eberlin

3
Tüm dosyaya referans alarak satır numarasını gösterir. kuyruk-f | nl, kuyruğun ilk çıkışına referans olarak alarak satır numarasını gösterir.
rafaelvalle

Bu çok kullanışlı ve adresleri OP'ın Başlığı ancak onların soru . X bir dosyada kaç kez göründüğünü bilmek istediler: P
Timmah

6

Çıktıyı ayrıca boruya aktarabilirsiniz, günlük boyunca ileri geri kaydırma yapmanızı sağlayan lessbir satır numarası özelliğine sahiptir -N.

$ tail -f /var/log/foo.log | less -N

Örnek

  1 Jan 17 22:11:58 greeneggs fprintd[4323]: ** Message: entering main loop
  2 Jan 17 22:12:01 greeneggs su: (to root) saml on pts/5
  3 Jan 17 22:12:28 greeneggs fprintd[4323]: ** Message: No devices in use, exit
  4 Jan 17 22:12:56 greeneggs gnome-session[1876]: 22:12:56 | Git | personal_repo | Checking for remote changes...
  5 Jan 17 22:12:56 greeneggs gnome-session[1876]: 22:12:56 | Cmd | personal_repo | git rev-parse HEAD
  6 Jan 17 22:12:56 greeneggs gnome-session[1876]: 22:12:56 | Cmd | personal_repo | git ls-remote --heads --exit-code "ssh://sam@sparkleshare.jake      
  6 8us.org/home/sam/SparkleShare/personal_repo.git" master
  7 Jan 17 22:12:58 greeneggs gnome-session[1876]: X11 forwarding request failed on channel 1
  8 Jan 17 22:12:58 greeneggs gnome-session[1876]: 22:12:58 | Git | personal_repo | No remote changes, local+remote: 532213be48cce3b93cb177d409faa      
  8 03b71d0cfa5
  9 Jan 17 22:13:35 greeneggs gnome-session[1876]: 22:13:35 | ListenerTcp | Pinging tcp://notifications.sparkleshare.org:443/
 10 Jan 17 22:13:35 greeneggs gnome-session[1876]: 22:13:35 | ListenerTcp | Received pong from tcp://notifications.sparkleshare.org:443/

NOT: Çıktıya dikkat edin. Bu özelliği beğenmiş veya beğenmeyebilirsiniz, ancak uzun satırları alır ve bir sonraki satırda devam etmeleri için onları doğrar ancak yine de aynı satır numarasını korur. Geniş günlük dosyaları ayrıştırırken bu özelliği paha biçilmez buluyorum! Bu özelliğin etkisini 6 ve 8 numaralı satırlarda görebilirsiniz .


Bu belirsiz. Dosya adı nerede belirtilir? Çıktının, dosya adının son 10 satırından başlayarak 1'den başlayarak, bunun varsayılan davranışı olduğu gibi numaralandırıldığı belirtilmelidir tail. Uzun hatlar gelince, o davranış içinde konum değiştirir lesskullanarak -S.
ILMostro_7

2

Grep için yeni onların hat numarası ile geldikleri gibi sadece günlük dosyasında satırları, bunu yapabilirsiniz:

{
  initial_lines=$(wc -l)
  tail -n +1 -f | awk -v NR="$initial_lines" '/pattern/{print NR": "$0}'
} < file.log

(ile mawk, girişini (!) arabelleğe -Winteractivealmayı önleme seçeneği eklemek istersiniz ).

wc -lZaten orada olan satırları okur ve onları sayar (son satır henüz dolu olmasa bile hala çalışan yeni satır karakterleri) ve sonra tail -fgeri kalanı ( wcokumayı durduran yerden başlayarak ) ve awksatır sayısının ne olduğunu söyleriz . ilk gördüğü.


seçme ldeğişken adı gibi olduğunu düşünerek, beni $ l gözlerimi şaşı yapılan $1^^ (ama (ve% 100 güven) bildiği gibi, ben tekrar okumak ve gerçeği gördü). Sadece merak için: ve arasındaki "yarış koşulu" ndan kaçınmak wc -liçin tail -f(dosya hızlı büyürse, bazı satırları atabilir ve böylece NR yanlış numaradan başlayabilir), $lbunun yerine satır atlamak mümkün müdür ? (ve kuyruğun -nposiks ve gnu cinsinden sınırları nedir?). Belki geçici bir ara dosya ile?
Olivier Dulac

@OlivierDulac, tail -n +1(başlangıç ​​konumundan bir şey oku) yarış durumu endişelerini giderir. Dosyada bulunmayan satırları wc -lsonlandırıldığı sırada, tam olarak wcbıraktığı yerden okuyacaktır . Böylece NR, wcbitiş ile tailbaşlama arasında kaç satır yazıldığına bakılmaksızın doğru konuma sahip olacaktır . Sorununuz varsa taildosyanın sonuna göre bir konumdan başlamanız söylenirse .
Stéphane Chazelas

oh, interresting: gerçekten, hiçbir şey okumadığı halde (wc başından başına kadar) veri stdin içinde toplanır ... bunu farketmeliydim. Teşekkürler. Şimdi neden "<dosya" olduğunu anladım. zeki, her zamanki gibi :)
Olivier Dulac

1
@OlivierDulac, sınırlamalar hakkında (burada geçerli değildir tail -n +1), normal dosyalar için, çoğu uygulamada seekbirden fazla buf değerini saklamak zorunda kalmadan ilk newline'ı bulana kadar en baştan ve baştan başlayabilecekleri bir uygulama yoktur. bellekteki verilerin Aranamayan giriş için, sınırlara girebileceğiniz yer burasıdır. POSIX, uygulamaların en az 10 x LINE_MAX bayt depolayabilmesini gerektirir (LINE_MAX en az 2048'tir). GNU kuyruğunun hafızadan başka bir sınırı yok AFAIK
Stéphane Chazelas

0

En baştan numaralandırmak istiyorsanız tüm satırlara başvurmak için grep -n'ye ihtiyacınız olacaktır.

 tail -f -n100000000 filename.log | grep -n '' 

O zaman sadece son 10'u göstermek isteseydin dosyayı yeniden atabilirsin diye düşünmüştüm:

 tail -f -n100000000 filename.log | grep -n '' | tail -n10

İlki kullanışlı, ancak çok fazla çıktı gösteriyor. İkincisinin neden işe yaramadığını bilmiyorum.


Kuyruğun "tüm satırları göster" i yok, bu yüzden benim 100000000
Martin Cleaver

1
tail -n +1 -fbaştan itibaren kuyruk.
Stéphane Chazelas 21:17

1
İkincisi çalışmaz, çünkü en sağdakiler tail, girişinin son satırını görene kadar hiçbir şey elde edemez (10. satırın hangisi olduğunu nasıl bilebilir?) tail -fAsla durmaz.
Stéphane Chazelas 21:17

-1

cat -n [filename] | tailEğer aradığınız buysa, komut hızlı bir şekilde sayılır ve en son kayıtların gösterimi yapılır.

-fGerçekten senaryoda uygulanabilir ses veya gereksiz değil - anahtar kaçış kadar kalıcı hale getirir.

wc -l [filename] hedefteki satırların sayısını alır.

wc -l [filenameprefix]* tüm dosyalardaki tüm satırları, kalıpla eşleşen dosyalarda sayar ve hatta sonunda toplam bir özet rapor eder.

Daha ayrıntılı detaylar daha eksiksiz cevaplar verebilir.


-1

Argüman nveya --lines(biraz farklı yollar kullanılır, aşağıya bakınız):

$ tail -f -n 25 /path/to/file.txt

$ tail -f --lines=25 /path/to/file.txt

Ayrıca yardıma bakınız:

$ tail --help

1
OP, satır numarası istiyor, satır sayısı değil.
robbat2
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.