লেজ -f, তবে লাইন সংখ্যা সহ


21

আমি একটি দূরবর্তী সার্ভারে একটি নির্বিচার পরিমাণের মধ্যে কতবার foo barউপস্থিত হয় তা দেখার চেষ্টা করছি /var/log/foo.log, তবে আমি এখনও চেষ্টা করেছিলাম এমন কিছুই কার্যকর হয়নি।

আমি ইতিমধ্যে একটি টাইমার স্ক্রিপ্ট পেয়েছি যা আমি টেলিং শুরু করার পরে কতদিন হয়ে গেছে তা ট্র্যাক রাখতে ব্যবহার করি /var/log/foo.logএবং এখন আমি কেবল একটি foo barলেখনির আউটপুটটিতে কতবার উপস্থিত হয়েছে তা বলার উপায় চাই ।

আমি গুগল অনুসন্ধান করেছি, তবে ফলাফলের প্রথম 10 পৃষ্ঠার মধ্যে আমি প্রাসঙ্গিক কোনও কিছু খুঁজে পাইনি।

হতাশার ফলাফল নিয়ে আমি যা চেষ্টা করেছি তা এখানে:

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

আমি এমন একটি সিড স্ক্রিপ্টও লিখতে চেষ্টা করেছি যা এর মতোই কাজ করতে পারে tail -fতবে আমি সেটির সাথে সীমিত-কোনও-অগ্রগতি তৈরি করেছি।

বিঃদ্রঃ

রিমোট সার্ভারটি কোরিউটিলসের একটি পুরানো সংস্করণ চলছে এবং আপগ্রেড করা একটি বিকল্প, তবে কোনওভাবেই পছন্দসই সমাধান নয় NOT


2
কোন উপায়ে এটি কাজ করে না? --line-bufferedবিকল্পটি চেষ্টা করে দেখুন grep। বাtail -f ... | awk '/foo bar/{print ++n, $0}'
স্টাফেন চেজেলাস

কেন এটি রিমোটে কাজ করে না? উদাহরণ:tail -f /var/log/log.log | awk '{ printf "[%d]> %s\n", NR+1 ,$0; fflush(stdout); }'

উত্তর:


29
tail -f | nl

আমার জন্য কাজ করে এবং আমি যা ভেবেছিলাম এটিই প্রথম - এটি যদি আপনি সত্যই লাইনটি 1 থেকে সংখ্যায়িত করে চান এবং ফাইলটি দেখেছেন এমন আসল লাইন নম্বরটি দিয়ে নয়। grepউপযুক্ত জায়গায় প্রয়োজন হলে either চ্ছিকভাবে যুক্ত করুন (হয় আগে বা পরে nl)। তবে মনে রাখবেন বাফারিং হতে পারে। আমার বিশেষ ক্ষেত্রে, grepহয়েছে --line-bufferedবিকল্প কিন্তু nlএটা আউটপুট বাফার এবং যে সুইচ বন্ধ করার জন্য একটি বিকল্প নেই। সুতরাং tail | nl | grepকম্বো সত্যিই সুন্দরভাবে প্রবাহিত হয় না।

বলেছিল,

tail -f | grep -n pattern

আমার জন্য কাজ করে। পুরো লগ ফাইল শুরু করার পরিবর্তে "টেইলিং" এর শুরু থেকে নম্বরটি আবার শুরু হয়।


সার্ভারে চলমান গ্রেপ সংস্করণের কোনও -nবিকল্প নেই।
আলেকজ মাগুরা

এটির অবশ্য দীর্ঘ বিকল্প রয়েছে --line-number: tail -f /var/log/foo.log | grep foo\ bar --line-numberকাজ!
আলেকজ মাগুরা

1
এটা আকর্ষণীয় - আমি যেমন POSIX চেক করা হয়েছে, কিন্তু গনুহ, grep র manpage বলেছেন: -n POSIX দ্বারা নির্দিষ্ট করা হয়
পিটারফ

16

আমি মনে করি এটি আরও ভাল ..

less -N +F <filepath>

2
আপনি কেন এটি আরও ভাল মনে করতে পারেন তা ব্যাখ্যা করতে পারেন?
নেভিগাট্রন

এটি একটি বৃহত সম্পাদনা, আমি ফিরে আসছি।
অ্যাডাম এবারলিন

3
রেফারেন্স হিসাবে পুরো ফাইলটি রেখার নম্বরটি দেখায়। লেজ -ফ | এনএল লেজের প্রথম আউটপুটকে রেফারেন্স হিসাবে গ্রহণ করে দেখায়।
রাফেলওয়ালে

এটি খুব সহজ এবং ওপির শিরোনামে সম্বোধন করে তবে তাদের প্রশ্ন নয় । তারা জানতে চেয়েছিলেন যে কোনও ফাইলে এক্স কতবার উপস্থিত হয়: পি
টিমমাহ

6

আপনি আউটপুটটি এতে পাইপও করতে পারেন less, এতে একটি লাইন নম্বর বৈশিষ্ট্য রয়েছে, -Nযা আপনাকে লগের মাধ্যমে পিছনে পিছনে স্ক্রোল করতে দেয়।

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

উদাহরণ

  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/

দ্রষ্টব্য: আউটপুট নোটিশ। আপনি এই বৈশিষ্ট্যটি পছন্দ করতে বা পছন্দ করতে পারেন না তবে এটি দীর্ঘ লাইনগুলি নেবে এবং সেগুলি কেটে ফেলবে যাতে তারা পরবর্তী লাইনে অবিরত থাকে তবে এখনও একই অনুরূপ লাইন নম্বর বজায় রাখে। লগ ফাইলগুলি প্রশস্ত করতে পার্স করার সময় আমি এই বৈশিষ্ট্যটি অমূল্য বলে মনে করি! আপনি 6 এবং 8 লাইনে এই বৈশিষ্ট্যের প্রভাব দেখতে পাবেন ।


এটা অস্পষ্ট। ফাইলের নাম কোথায় নির্দিষ্ট করা আছে? এটি স্পষ্ট করে উল্লেখ করা উচিত, আউটপুটটি ফাইলের নামের শেষ 10 লাইন দিয়ে শুরু করে 1 থেকে গণনা করা হয়, কারণ এটি ডিফল্ট আচরণ tail। দীর্ঘ লাইন হিসাবে, যে আচরণ মধ্যে টগল করার মাধ্যমে চালু করা হয় lessব্যবহার করে -S
ILMostro_7

2

Grep করতে নতুন শুধুমাত্র লগ ফাইলে লাইন হিসাবে তারা তাদের লাইন সংখ্যা সঙ্গে আসা, আপনি কি পারে:

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

(এর সাথে mawk, আপনি -Winteractiveএর ইনপুট (!) বাফারিং প্রতিরোধের বিকল্পটি যুক্ত করতে চাইবেন ।

wc -lইতিমধ্যে সেখানে উপস্থিত রেখাগুলি পড়ে এবং তাদের গণনা করা হয় (নতুন লাইনের অক্ষর যার অর্থ এটি এখনও শেষ হয় যদিও শেষ লাইনটি এখনও পূর্ণ না হলেও), এবং তারপরে আমরা tail -fবাকী (যেখানে wcপড়া বন্ধ করেছিলাম সেখানে থেকে শুরু করে ) এবং বলব awkলাইন সংখ্যাটি কী এটি প্রথম দেখায়।


lপরিবর্তনশীল নাম হিসাবে চয়ন করা আমাকে eyes l এ ভেবে আমার চোখকে তুচ্ছ করে তোলে $1but (তবে আমি জানি (এবং 100% বিশ্বাস) আপনি, আমি পুনরায় পাঠ করেছি এবং সত্যটি দেখেছি)। শুধু কৌতূহল জন্য: মধ্যে কিছু "race অবস্থা" এড়াতে wc -lএবং tail -f(যদি ফাইল দ্রুত বৃদ্ধি, এক কিছু লাইন খারিজও করতে পারেন এবং এইভাবে এন আর ভুল নম্বর থেকে শুরু), এটিও সম্ভব হতে এড়িয়ে যেতে $lপরিবর্তে লাইন? (এবং -nপোজিক্স এবং গ্নুতে পুচ্ছের কত সীমা আছে ?)। একটি অস্থায়ী মধ্যবর্তী ফাইল সঙ্গে হতে পারে?
অলিভিয়ার ডুলাক

@ অলিভিয়ারডুলাক, tail -n +1(শুরুর অবস্থান থেকে যে কোনও কিছু পড়ুন) জাতি শর্তের উদ্বেগের বিষয়ে আলোচনা করেছেন। এটি wc -lসমাপ্ত সময়ে ফাইলটিতে থাকা লাইনগুলি পড়বে , সঠিক অবস্থানটি wcছেড়ে দিয়েছিল। সুতরাং wcশেষ এবং tailশুরু করার মধ্যে কতগুলি লাইন লেখা হয়েছে তা নির্বিশেষে এনআর সঠিক অবস্থান পাবে । আপনি যদি tailসমস্যার সমাধান করেন তবে ফাইলের শেষের তুলনায় কিছু অবস্থান থেকে শুরু করতে বলেছিলেন এটি ।
স্টাফেন চেজেলাস

ওহ, হস্তক্ষেপ: আসলে, স্টাডিনে ডেটা জমা হয় যখন কিছুই পড়ে না (ডাব্লুসিটির শেষের মাঝামাঝি পর্যন্ত মাথার শুরু হওয়া পর্যন্ত) ... আমার এটা বুঝতে হবে। ধন্যবাদ. এখন দেখছি আপনি "<ফাইল" কেন করছেন। চতুর, যথারীতি :)
অলিভিয়ার ডুলাক

1
অলিভিয়ারডুলাক, সীমাবদ্ধতা সম্পর্কে (যা tail -n +1এখানে প্রয়োগ হয় না ) নিয়মিত ফাইলগুলির জন্য, বেশিরভাগ বাস্তবায়নের একটি থাকে না কারণ তারা শেষ এবং seekপিছনে শুরু করতে পারে যতক্ষণ না তারা একাধিক বুফের মূল্য সংরক্ষণ না করে নবম লাইন খুঁজে না পায় স্মৃতিতে তথ্য। অ-অনুসন্ধানযোগ্য ইনপুটটির জন্য, আপনি সীমাতে চলে যেতে পারেন। POSIX এর জন্য কমপক্ষে 10 এক্স LINE_MAX বাইট (LINE_MAX ন্যূনতম 2048 হওয়া) সংরক্ষণ করতে সক্ষম হওয়ার জন্য বাস্তবায়ন প্রয়োজন। জিএনইউ লেজের মেমরি ছাড়া অন্য কোনও সীমা নেই AFAIK
স্টাফেন চেজেলাস

0

আপনি যদি প্রথম থেকেই নম্বরটি দেখতে চান তবে আপনার সব লাইনে প্রয়োগ করার জন্য গ্রেপ-এন দরকার।

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

আপনি যদি কেবল তখনই 10 টি দেখাতে চেয়েছিলেন তবে আমি ভেবেছিলাম আপনি ফাইলটি পুনরায় লেজ করতে পারবেন:

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

প্রথমটি কার্যকর, তবে খুব বেশি আউটপুট দেখায়। দ্বিতীয়টি কেন কাজ করে না জানি না।


লেজটির "সমস্ত লাইনগুলি দেখান" নেই তাই আমার 100000000
মার্টিন ক্লিভার

1
tail -n +1 -fশুরু থেকে লেজ।
স্টাফেন চেজেলাস

1
দ্বিতীয়টি কাজ করে না কারণ tailতার ইনপুটটির শেষ লাইনটি না দেখা পর্যন্ত ডান-সর্বাধিক কিছুই আউটপুট দিতে পারে না (এটি কীভাবে জানবে যে দশম শেষ লাইনটি কোনটি?) যা tail -fকখনই থামবে না।
স্টাফেন চেজেলাস

-1

আদেশ cat -n [filename] | tailআপনি যদি সন্ধান করছেন সেক্ষেত্রে সাম্প্রতিকতম রেকর্ডগুলির দ্রুত গণনা এবং প্রদর্শন করবে।

দ্য -fযা সত্যিই আপনার দৃশ্যকল্প মধ্যে প্রযোজ্য লাগছে না বা অপ্রয়োজনীয় - সুইচ এটা পালাবার পর্যন্ত ক্রমাগত করে তোলে।

wc -l [filename] লক্ষ্যে রেখার একটি গণনা পাবে

wc -l [filenameprefix]* প্যাটার্নের সাথে মিলে সমস্ত ফাইলগুলিতে সমস্ত লাইন গণনা করবে এবং শেষে মোট সংক্ষিপ্তসার প্রতিবেদন করবে।

আরও সম্পূর্ণ বিশদ আরও সম্পূর্ণ প্রতিক্রিয়া পেতে পারে।


-1

এটি তর্ক nবা --lines(কিছুটা ভিন্ন উপায়ে ব্যবহৃত, নীচে দেখুন):

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

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

সহায়তাটিও দেখুন:

$ tail --help

1
ওপি লাইন সংখ্যা চায়, লাইন সংখ্যা নয়।
রোবট 2
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.