範囲検索を実行するためにsedを使用しています。日付と時刻の2016-09-29 01:00
ログデータを解析したいです2016-09-29 01:30
。だから私は次のコマンドを使用しています。
$ sed -n '/2016-09-29 01:/,/2016-09-29 01:30:.*$/p'
しかし、問題は、ログで1:30を使用できない場合は、すべてのログを最後まで返すことです。
1:30
それでは、存在しない場合は最後まで次のレコードに移動するようにこれを処理する方法は?
考慮すべき事項: ログには以下が含まれます。スタックトレースしたがって、スタックトレースを含む行は日付で始まりません。
答え1
それほど奇妙ではありません。sed
はSトレメ編集するitorは行が発生したとおりに処理します。この範囲は、/a/,/b/
行が見つかるとすぐに選択され、a
見つかった後は選択されなくなることを意味します。b
行が見つからない場合、b
行の選択は中断されません。
ここではを使用する必要がありますawk
。これらのタイムスタンプが行の先頭にあるとします。
awk '$0 >= "2016-09-29 01:" && $0 < "2016-09-29 01:30"'
範囲にタイムスタンプがある行のみが選択されるため、タイムスタンプのない行は、範囲にタイムスタンプがある行の間にあっても除外されます。
この問題を解決する別の方法は次のとおりです。
awk -v start='2016-09-29 01:' -v end='2016-09-29 01:30' '
$0 >= start && $0 <= end, /^[0-9]{4}([ :-][0-9]{2}){5}/ && $0 >= end'
つまり、inなどの範囲を使用しますが、sed
2つの日付の間の最初の行に範囲を入力し、終了日より大きいタイムスタンプを持つ行を見つけた場合にのみこれを保持します。