Saya mencoba untuk melihat berapa kali foo bar
muncul /var/log/foo.log
dalam jumlah waktu yang sewenang-wenang pada server jauh, tetapi tidak ada yang saya coba sejauh ini yang berhasil.
Saya sudah punya skrip pengatur waktu yang saya gunakan untuk melacak berapa lama sejak saya mulai membuntuti /var/log/foo.log
, dan sekarang saya hanya ingin cara untuk mengetahui berapa kali foo bar
telah muncul di keluaran berekor.
Saya mencari di Google, tetapi saya tidak menemukan sesuatu yang relevan dalam 10 halaman pertama hasil.
Inilah yang saya coba dengan hasil yang membuat frustrasi:
## 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}'
Saya bahkan mencoba untuk menulis skrip sed yang akan bertindak seperti tail -f
, tapi saya membuat kemajuan tanpa batas dengan itu.
CATATAN
server jarak jauh menjalankan versi coreutils yang lebih lama, dan memutakhirkan adalah suatu pilihan, tetapi TIDAK dengan cara apa pun solusi yang diinginkan.
sumber
--line-buffered
opsi untukgrep
. Atautail -f ... | awk '/foo bar/{print ++n, $0}'
tail -f /var/log/log.log | awk '{ printf "[%d]> %s\n", NR+1 ,$0; fflush(stdout); }'
Jawaban:
berfungsi untuk saya dan ini adalah yang pertama saya pikirkan - yaitu jika Anda benar-benar ingin garis-garisnya bernomor 1 dan bukan dengan nomor garis nyata dari berkas yang ditonton. Secara opsional tambahkan
grep
jika diperlukan ke tempat yang sesuai (baik sebelum atau sesudahnl
). Namun, ingatlah bahwa buffering dapat terjadi. Dalam kasus khusus saya,grep
memiliki--line-buffered
opsi, tetapinl
buffer output dan tidak memiliki opsi untuk mematikannya. Karenanyatail | nl | grep
kombo tidak benar-benar mengalir dengan baik.Yang mengatakan,
bekerja untuk saya juga. Penomoran dimulai lagi dari awal "tailing" daripada awal seluruh file log.
sumber
-n
opsi.--line-number
:tail -f /var/log/foo.log | grep foo\ bar --line-number
berfungsi!Saya pikir ini lebih baik ..
sumber
Anda juga dapat menyalurkan output ke
less
, ia memiliki fitur nomor baris,-N
yang akan memungkinkan Anda untuk menggulir bolak-balik melalui log.Contoh
CATATAN: Perhatikan output. Anda mungkin atau mungkin tidak suka fitur ini, tetapi akan mengambil garis panjang dan memotongnya sehingga mereka melanjutkan pada baris berikutnya, tetapi masih mempertahankan nomor baris yang sesuai. Saya menemukan fitur ini sangat berharga ketika mem-parsing file log yang lebar! Anda dapat melihat efek dari fitur ini pada baris 6 & 8 .
sumber
tail
. Adapun garis panjang, perilaku itu diaktifkan dalamless
menggunakan-S
.Untuk menerima baris baru hanya di file log saat mereka datang dengan nomor baris mereka, Anda bisa melakukan:
(dengan
mawk
, Anda ingin menambahkan-Winteractive
opsi untuk mencegah buffering input (!)).wc -l
membaca baris yang sudah ada dan menghitungnya (karakter baris baru yang artinya masih berfungsi bahkan jika baris terakhir belum penuh), dan kemudian kitatail -f
sisanya (mulai dari tempatwc
berhenti membaca) dan memberi tahuawk
berapa nomor baris dari yang pertama dilihatnya.sumber
l
sebagai nama variabel membuat saya memicingkan mata pada $ l, berpikir itu$1
^^ (tapi seperti yang saya tahu (dan kepercayaan 100%) Anda, saya membaca ulang dan melihat kebenaran). Hanya untuk rasa ingin tahu: untuk menghindari beberapa "kondisi ras" antarawc -l
dantail -f
(jika file tumbuh cepat, seseorang dapat membuang beberapa baris dan dengan demikian NR dimulai dari angka yang salah), apakah mungkin untuk melewati$l
garis saja? (dan batas apa yang ada untuk-n
mengekor di posix & di gnu?). Mungkin dengan file perantara sementara?tail -n +1
(baca apa pun dari posisi awal) mengatasi masalah kondisi lomba. Ini akan membaca baris yang tidak ada dalam file pada saatwc -l
diakhiri, dari posisi yang tepatwc
meninggalkannya. Jadi NR akan memiliki posisi yang tepat terlepas dari berapa banyak baris yang telah ditulis di antarawc
akhir dantail
awal. Itu jika Anda diberitahutail
untuk memulai dari beberapa posisi relatif ke akhir file yang Anda akan memiliki masalah.tail -n +1
sini), untuk file biasa, sebagian besar implementasi tidak memiliki satu karena mereka dapat mulai dari akhir danseek
kembali sampai mereka menemukan baris baru ke-n tanpa harus menyimpan lebih dari satu nilai buf data dalam memori. Untuk input yang tidak dapat dicari, di situlah Anda dapat mengalami batasan. POSIX membutuhkan implementasi untuk dapat menyimpan setidaknya 10 x LINE_MAX byte (LINE_MAX setidaknya 2048). GNU tail tidak memiliki batas selain memori AFAIKJika Anda ingin memberi nomor dari awal, Anda perlu grep -n untuk diterapkan ke semua baris.
Jika Anda hanya ingin menunjukkan 10 yang terakhir, saya pikir Anda dapat mengekor kembali file tersebut:
Yang pertama berguna, tetapi menunjukkan terlalu banyak output. Saya tidak tahu mengapa yang kedua tidak berhasil.
sumber
tail -n +1 -f
ke ekor dari awal.tail
tidak bisa menghasilkan apa-apa sampai telah melihat baris terakhir dari inputnya (bagaimana ia tahu yang merupakan baris terakhir ke-10?) Yang tidak akan pernah terjadi karenatail -f
tidak pernah berhenti.Perintah
cat -n [filename] | tail
akan mendapatkan penghitungan cepat dan menampilkan catatan terbaru jika itu yang Anda cari.The
-f
beralih membuatnya terus-menerus sampai melarikan diri - yang benar-benar tidak terdengar berlaku dalam skenario atau berlebihan.wc -l [filename]
akan mendapatkan hitungan garis di targetwc -l [filenameprefix]*
akan menghitung semua baris di semua file yang cocok dengan pola dan bahkan melaporkan total ringkasan di akhir.Detail yang lebih lengkap dapat menghasilkan respons yang lebih lengkap.
sumber
Argumennya
n
atau--lines
(menggunakan cara yang sedikit berbeda, lihat di bawah):Lihat juga bantuannya:
sumber