web-dev-qa-db-ja.com

特定の行番号からログファイルを追跡する

特定の行数でテキストファイルを調整する方法を知っています。

tail -n50 /this/is/my.log

ただし、その行数を変数にするにはどうすればよいですか?

あるプログラムによって毎日追加される大きなログファイルがあるとしましょう。ログファイルのすべての行は、次の形式の日時で始まります。

Day Mon YY HH:MM:SS

毎日、ログファイルの末尾を出力したいのですが、前日のレコードのみです。この出力が真夜中過ぎに実行されたとしましょう。私は尻尾が翌日にこぼれる心配はありません。

昨日の日付の最初の出現に基づいて、テールする行数を計算できるようにしたいだけです...

それは可能ですか?

3
Molenpad

タイトルの質問に答えると、そのようにここに来る人は誰でも、頭と尾の両方が、除外するファイルの量のコードを受け入れることができます。

  • テールの場合、行番号num-n +numを使用して開始します
  • 頭の場合、印刷しない行数には-n -numを使用します

これは、前回コマンドを実行したときの行数を覚えていて、その数をtail -n +$prevlinesに使用して、頻度に関係なく、部分ログの次の部分を取得した場合、実際の質問に関連します。ログがチェックされます。

実際の質問に答えて、grepできる特定の行の後にすべてを印刷する1つの方法は、ばかげたカウントで-Aオプションを使用することです。これは、数日間の結果を得ることができるため、ここでの他の回答よりも役立つ場合があります。したがって、昨日から今日までのすべてを取得するには、次のようにします。

grep "^`date -d yesterday '+%d %b %y'`" -A1000000 log_file.txt

2つのgrepsを組み合わせて、2つの日付範囲の間で印刷できます。

これは、ログファイルで実際に発生する日付に依存することに注意してください。範囲マーカーとして使用される特定の日にイベントがログに記録されなかった場合、何も見つからないという弱点があります。

これを解決するには、開始日と終了日のダミーレコードを挿入し、grepする前にファイルを並べ替えることができます。ただし、これはおそらくやり過ぎであり、並べ替えには費用がかかる可能性があるため、例を挙げません。

3
Gem Taylor

尻尾にはこのような機能はないと思います。

Awkを使用して開始行番号と終了行番号を計算することもできますが、ログファイルからこれらの行を正確に取得する場合は、おそらくgrepとdateを組み合わせて使用​​するのが最も簡単な方法です。行の先頭で昨日の日付を一致させると機能するはずです。

grep "^`date -d yesterday '+%d %b %y'`" < log_file.txt

ログファイルにあるものと正確に一致するように日付形式を調整する必要がある場合があります。

2
sheltond

テールなしでそれを行うことができます。前の日付の行をgrepするだけです。

猫my.log | grep "$(date -d"昨日13:00 "'+%d%m%Y')"

また、行数が必要な場合は、|を追加できます。 wc -l

0
Vladimir.V.Bvn

次のように、日付と合計行を含む最初の行の行番号を取得することにより、試行錯誤しながらこれを解決しました。

lines=$(wc -l < myfile.log)

start=$(cat myfile.log | grep -no $datestring | head -n1 | cut -f1 -d:)

n=$((lines-start))

そしてそれに基づいて、尾:

tail -n$n myfile.log
0
Molenpad