web-dev-qa-db-ja.com

tail -f、ただし行番号あり

リモートサーバーで任意の時間内に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のように振る舞うsedスクリプトを作成することさえ試みましたが、私はそれで制限された-無制限の前進をしました。

[〜#〜]ノート[〜#〜]

リモートサーバーは古いバージョンのcoreutilsを実行しており、アップグレードはオプションですが、望ましい解決策としては[〜#〜] not [〜#〜]です。

23
Alexej Magura
tail -f | nl

私にとってはうまくいき、私が最初に思ったのはこれです。つまり、監視されているファイルの実際の行番号ではなく、1から番号が付けられた行が本当に必要な場合です。必要に応じて、必要に応じてgrepを適切な場所に追加します(nlの前または後)。ただし、バッファリングが発生する可能性があることに注意してください。私の特定のケースでは、grepには--line-bufferedオプションですが、nlは出力をバッファリングし、それをオフにするオプションはありません。従って tail | nl | grepコンボは本当にうまく流れません。

それは言った、

tail -f | grep -n pattern

私にも有効です。番号付けは、ログファイル全体の先頭ではなく、「テーリング」の先頭から再び開始されます。

30
peterph

これがいいと思います。

less -N +F <filepath>
17
Adam Eberlin

出力を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://[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/

注:出力に注意してください。この機能は好きかもしれませんし、好まないかもしれませんが、長い行を取り、次の行に続くように切り詰めますが、対応する同じ行番号を維持します。幅の広いログファイルを解析する場合、この機能は非常に貴重です。この機能が行68に及ぼす影響を確認できます。

6
slm

行番号が付いているため、ログファイルのnew行のみをgrepするには、次のようにします。

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

mawkを使用すると、-Winteractiveinput(!)バッファリングを防ぐオプション)。

wc -lは、行を読み取りますすでにそこにありましたを数えて(最後の行がまだいっぱいになっていなくても機能する改行文字を)カウントし、次にtail -f残りの部分(wcが読み取りを停止したところから開始)およびawkに、最初に表示される行番号を伝えます。

2

最初から番号を付けたい場合は、grep -nをすべての行に適用する必要があります。

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

次に、最後の10件のみを表示したい場合は、ファイルを小売りできると思いました。

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

1つ目は便利ですが、出力が多すぎます。 2つ目が機能しない理由はわかりません。

0
Martin Cleaver