quyruq-f, lekin chiziqli raqamlar bilan

/var/log/foo.log foo bar kodini necha marta ko'rishni xohlayapsiz? Uzoq serverda tasodifiy vaqt ichida Hozirgacha sinab ko'rdim.

Men /var/log/foo.log dan foydalanishni boshlaganimdan beri qancha vaqt bo'lganini kuzatib borish uchun foydalanadigan taymer skriptini oldim. kuyrukli chiqishda qancha marta foo bar paydo bo`lganligini ayting.

Men google-ni qidirdim, lekin natijaning dastlabki 10 sahifasida hech narsa topolmadim.

Asabiylashib ketgan natijalarni sinab ko'rdim:

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

Hatto tail -f kabi harakat qiladigan sed-scriptni yozishga harakat qilardim, ammo bu bilan cheklangan-to-no harakat qildim.

QAYD

uzoq server coreutilsning eski versiyasini ishga tushiradi va yangilanish bir variant, biroq istalgan echimdan NOT hisoblanadi.

18
Bu qanday ishlamaydi? grep uchun - layn-buffered parametrini ko'ring. Yoki quyruq -f ... | awk '/ foo bar/{chop etish ++ n, $ 0}'
qo'shib qo'ydi muallif Stéphane Chazelas, manba
Nima uchun u uzoqdan ishlamaydi? Misol: quyruq -f /var/log/log.log | awk '{printf "[% d]>% s \ n", NR + 1, $ 0; fflush (stdout); } "
qo'shib qo'ydi muallif gburton, manba

7 javoblar

tail -f | nl

men uchun ishlaydi va mening fikrimcha birinchi narsa - ya'ni chiziqlarni 1dan raqamlangan chiziqlardan tomosha qilishni xohlaysizmi. Kerak bo'lsa kerakli joyga ( nl dan oldin yoki keyin) kerak bo'lsa, grep ni qo'shing. Biroq, xotirada saqlash mumkinligini unutmang. Mening shaxsiy holimda grep kodi - buffered parametriga ega, lekin nl bu chiqadi va uning almashinuvi mavjud emas bu yopiq. Shuning uchun tail | nl | grep combo aslida chiroyli oqim emas.

Ya'ni,

tail -f | grep -n pattern

men uchun ham ishlaydi. Raqamlash jarayoni butun kunlik faylning boshlanishiga emas, balki "quyruq" ning boshidan boshlab boshlanadi.

24
qo'shib qo'ydi
serverda ishlaydigan grep versiyasi -n parametriga ega emas.
qo'shib qo'ydi muallif Ryan Cook, manba
Biroq, - line-number - uzun variantga ega: quyruq -f /var/log/foo.log | grep foo \ bar satr-raqami ishlaydi!
qo'shib qo'ydi muallif Ryan Cook, manba
Qiziqarli - men POSIXni bunday tekshirganim yo'q, lekin GNU grep man sahifasida shunday deyilgan: -n POSIX tomonidan aniqlanadi .
qo'shib qo'ydi muallif A. Stevens, manba

Bu yaxshiroq deb o'ylayman.

less -N +F 
11
qo'shib qo'ydi
Bu katta tahrir, men qaytaman.
qo'shib qo'ydi muallif Tomas, manba
Nima uchun uni yaxshiroq deb o'ylaysan?
qo'shib qo'ydi muallif Raditz_35, manba
Barcha faylni mos yozuvlar sifatida olib boruvchi chiziq raqamini ko'rsatadi. quyruq -f | nl quyruqning birinchi chiqishi sifatida havola qilinadigan qatorni raqamini ko'rsatadi.
qo'shib qo'ydi muallif Rich Jennings, manba

Bundan tashqari siz chiqishni less ga kiritishingiz mumkin, bu sizning log orqali oldinga va orqaga harakat qilishingizga imkon beruvchi -N qator raqamlari xususiyati mavjud.

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

Misol

  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://[email protected]      
  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/

NOTE: Take notice of the output. You may or may not like this feature, but it will take long lines and chop them so that they continue on the next line, but still maintain the same corresponding line number. I find this feature invaluable when parsing log files that are wide! You can see the effect of this feature on lines 6 & 8.

6
qo'shib qo'ydi
@ ILMostro_7 - ​​rahmat shu.
qo'shib qo'ydi muallif Patrick Szalapski, manba
Bu aniq emas. Fayl nomi qaerda ko'rsatilgan? tail ning odatiy xatti bo'lgani uchun, faylning oxirgi 10 qatoridan boshlab chiqish 1dan raqamlanganligini ta'kidlash kerak. Uzoq chiziqlarga kelsak, u holda -S dan foydalangan holda less ichida xatti-harakatlar amalga oshiriladi.
qo'shib qo'ydi muallif LBogaardt, manba

Yangi yangi qatorlarini faqat log faylida o'zlarining qatorlari raqamlari bilan kelganidek ochish uchun quyidagilarni qilishingiz mumkin:

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

( mawk ) bilan kirish (!) buferlanishini oldini olish uchun -Winteractive parametrini qo'shishni xohlaysiz.

wc -l reads the lines that were already there and counts them (the newline characters which means it still works even if the last line is not full yet), and then we tail -f the rest (starting from where wc stopped reading) and tell awk what is the line number of the first one it sees.

1
qo'shib qo'ydi
@OlivierDulac, cheklovlar haqida (bu erda tail -n +1 uchun amal qilmaydi), muntazam fayllar uchun, ko'pchilik ilovalar oxiridan boshlashlari mumkin va n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n-n + Noma'lum usulda kirish uchun siz chegaralar ichida ishlashingiz mumkin. POSIX kamida 10 x LINE_MAX bayt (LINE_MAX - kamida 2048) bo'lishi kerak bo'lgan ilovalarni talab qiladi. GNU quyruq xotirasi AFAIK dan boshqa hech qanday chegarasi yo'q
qo'shib qo'ydi muallif Stéphane Chazelas, manba
@OlivierDulac, quyruq -n +1 (boshlang'ich pozitsiyasidan biron narsani o'qib chiqing) poyga ahvolini hisobga oladi. wc -l vaqtidagi faylda mavjud bo'lmagan satrlarni o'qiydi, aniq kod wc dan chiqib ketdi. Ya'ni wc va tail o'rtasida qancha qator yozilganligi qat'iy nazar NR to'g'ri pozitsiyaga ega bo'ladi. Agar tail so'zini aytadigan bo'lsangiz, u sizning muammolaringiz bo'lgan faylning oxiriga nisbatan ba'zi bir joydan boshlash uchun.
qo'shib qo'ydi muallif Stéphane Chazelas, manba
o'zgarmaydigan nom sifatida l ni tanlab, $ l ga ko'zimni tikib qo'ydi, bu $ 1 ^^ deb o'yladim (lekin bilaman (va 100% ishonch) va haqiqatni ko'rgan). Faqatgina qiziqish uchun: wc -l va quyruq -f o'rtasidagi ba'zi bir "poyga holati" oldini olish uchun (agar fayl tez o'ssa, ba'zi qatorlarni olib tashlashi mumkin va shuning uchun NR noto'g'ri raqamdan boshlanadi), buning o'rniga $ l yo'nalishlarini o'tkazib yuborish mumkinmi? (va posix & gnu-da quyruqning -n chegarasi mavjudmi?). Ehtimol, vaqtinchalik qidiruv fayli bormi?
qo'shib qo'ydi muallif Olivier Dulac, manba
oh, intersting: aslida, ma'lumotlar hech narsa o'qilmaganda (wc oxirining boshi boshiga qadar), agar stdinga to'plansa ... buni tushunib etishim kerak edi. Rahmat. Keling, nima uchun "
qo'shib qo'ydi muallif Olivier Dulac, manba

Buyruq cat -n [filename] | quyruq sizga tezkorlik va eng yangi yozuvlarni namoyish qiladi, agar u siz qidirayotgan narsangiz bo'lsa.

-f kaliti qochib ketgunga qadar doimiyligini ta'minlaydi - bu sizning stsenaristlaringizda amal qilmaydi yoki keraksiz hisoblanadi.

wc -l [filename] will get a count of the lines in the target

wc -l [filenameprefix]* will count all lines in all files matching the pattern and even report a summary total at the end.

Batafsil to'liq tafsilotlar batafsil javob berishi mumkin.

1
qo'shib qo'ydi

Agar siz boshidan raqam yozishni istasangiz, grep -n ga kerakli barcha satrlarga murojaat qilishingiz kerak.

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

Agar siz faqat oxirgi 10ni ko'rsatishni xohlasangiz, siz faylni qayta tiklashingiz mumkin deb o'ylardim:

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

Birinchisi foydalidir, lekin juda ko'p chiqdi ko'rsatadi. Nima uchun ikkinchisining ishi yo'qligini bilmayman.

0
qo'shib qo'ydi
Ikkinchisi ishlamaydi, chunki eng ko'p tail kiritilgan so'nggi satrni ko'rmaguncha (qanday 10-chi oxirgi satrni bilish mumkin) ko'rmaguncha biror narsa chiqara olmaydi. quyruq -f kabi hech qachon to'xtamaydi.
qo'shib qo'ydi muallif Stéphane Chazelas, manba
quyruq -n +1 -f boshidan oxirigacha.
qo'shib qo'ydi muallif Stéphane Chazelas, manba
Tailda "barcha yo'nalishlarni ko'rsatish" yo'q, shuning uchun mening 100000000
qo'shib qo'ydi muallif Martin Cleaver, manba

Bu n yoki - lines argumenti (biroz boshqacha usullardan foydalaning, quyida ko'ring).

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

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

Shuningdek qarang:

$ tail --help
0
qo'shib qo'ydi