Bash で月、日付、時刻でログファイルをフィルタリングする

Bash で月、日付、時刻でログファイルをフィルタリングする

Apr 24 10:00:00.000000次のログ間と次のログ内からデータを取得したいのですが、Apr 25 24:00:00.999999これを行う方法がわかりません。

files/file1:Apr 22 02:47:00.663117 somedata    
files/file1:Apr 23 04:47:00.663127 somedata    
files/file1:Apr 24 05:47:00.663137 somedata    
files/file1:Apr 24 10:47:00.663137 somedata    
files/file1:Apr 25 01:47:00.663147 somedata    
files/file1:Apr 25 23:47:00.663157 somedata    
files/file1:Apr 25 23:47:00.663167 somedata    
files/file1:Apr 26 23:47:00.663177 somedata

次のコマンドを試しましたが、これは時間ごとにフィルタリングされ、日付は考慮されません。

awk -v start=10:00:00.000000 -v stop=24:00:00.999999 'start <= $3 && $3 <= stop'

私はちょうど次のデータを取得したいと思います:

files/file1:Apr 24 10:47:00.663137 somedata    
files/file1:Apr 25 01:47:00.663147 somedata    
files/file1:Apr 25 23:47:00.663157 somedata    
files/file1:Apr 25 23:47:00.663167 somedata

この問題を解決するのに役立つ人はいますか?また、フィルタリングするときに月を考慮すると便利です。

ベストアンサー1

非常に簡単に日付フィルタに多くの変数を追加できます。

awk -v start_day=24 -v stop_day=25 -v start_time=10:00:00.000000 -v stop_time=24:00:00.999999 'start_day <= $2 && $2 <= stop_day && start_time <= $3 && $3 <= stop_time' file

生産する

files/file1:Apr 24 10:47:00.663137 somedata    
files/file1:Apr 25 23:47:00.663157 somedata    
files/file1:Apr 25 23:47:00.663167 somedata

我々は時間を午前10時以下に盲目的にフィルタリングしたので、4月25日ラインを見逃した。私たちがしなければならないのは、最初の日の時間をフィルタリングする論理テストを実装することだけです。

awk -v start_day=24 -v stop_day=25 -v start_time=05:00:00.000000 -v stop_time=05:00:00.999999 'start_day <= $2 && $2 <= stop_day && (start_time <= $3 || start_day != $2) && $3 <= stop_time' file

生産する

files/file1:Apr 24 10:47:00.663137 somedata    
files/file1:Apr 25 01:47:00.663147 somedata    
files/file1:Apr 25 23:47:00.663157 somedata    
files/file1:Apr 25 23:47:00.663167 somedata 

数ヶ月間は同じアイデアに従うことができますが、Aprを04に変換し(前処理またはawkマジック?)<==>を適用する必要があります。

おすすめ記事