grep
一致後に行サイズの異なるコンテンツを返す方法を見つける必要があります。一部のゲームは4行につながり、一部のゲームは20行につながります。私はそれらすべてが必要です。
毎時間、次のタイムスタンプを含む前回のログエントリを返そうとします。
time: 20200115132443
これを行うには、各cronjobが前回のタイムスタンプをgrepステートメントとして実行しているとします。
grep "time: 2020011507"
私が経験している問題は、一致後にいくつかのエントリのログサイズが異なるため、このようなものはgrep -C 5
常に機能しないことです。
次の一致するgrepステートメント(最後の項目が欠落している)に一致するすべての項目を返す必要があるのか、それとも別の方法があるのか疑問に思います。サンプルログファイルの断片は次のとおりです。
time: 20200115132443
logging stuffs
time: 20200115134543
more logging
stuffs
like this
time: 20200115140201 # this should now not be returned
おそらく複雑すぎるので、grep
現在の時刻のステートメントを実行してから、その時刻より前と前の時刻以降のすべてを取得できます。
答え1
可能な方法:
# variable S0 - date string for hour ago
S0="time: $(date -d '1 hour ago' +%Y%m%d%H)"
# Variable S1 - date string for current hour
S1="time: $(date +%Y%m%d%H)"
# taking lines from between two just defined strings
# including first and excluding second date string
# from file /var/log/log.log
sed -n "/^${S0}/,/^${S1}/ {/^${S1}/"'!p};' /var/log/log.log
それでは、コンパクトなシングルライナーにしてみてください。
sed -n "/^time: $(date -d '1 hour ago' +%Y%m%d%H)/,/^time: $(date +%Y%m%d%H)/ {/^time: $(date +%Y%m%d%H)/"'!p}' /var/log/log.log
出力を一時ファイルにリダイレクトして使用できます。
あるいは、ライナーの最後にパイプとgrepを追加することもできます。
|grep "mystring"
。
ポリスチレンオペレーティングシステム依存コマンド日付形式は異なる場合があります。
ここで使用するLinuxは次のとおりです。日付 -d '1 時間前' +%Y%m%d%H
私たちはLinuxを使うことができます:日付-d @$(($(Date+%s)-3600)) +%Y%m%d%H
Mac OS X:日付-r $(($(Date+%s)-3600)) +%Y%m%d%H
など。
修正する:見つかった最後の行を削除するために使用されたsed部分「$ d」が機能しないことを発見し、正しく機能するようにsed行を更新しました。