awk '/10:..:/, /13:..:/' server.log > /tmp/awktmp
誰かが私に与えた命令を試してみました。午前10時から午後13時の間にログを見つけるのは効果的ですが、完全には理解していません。
エレガントな解決策があれば教えてください。リモートサーバーは小型で高度なユーティリティがないことに注意してください。
ここで私が理解していないことは'/10:..:/, /13:..:/'
- 私は
10:..
それが2桁の数字を意味し10
、:
正確に一致することを理解しています。 - しかし、もう一つはどういう
:
意味ですか?
JavaScriptの正規表現のように、スラッシュが正規表現を入力するために使用されるようです。私はこれについて100%確信していません。
アップデート1:
時間は2番目の列にあり、フォーマットは次のとおりです。HH:MM:SS
アップデート2:
sed -n -e '/8:..:../,/9:..:../p' application.log > /tmp/sedtmp
私はこれを試しましたが、これも07:57:47
。
アップデート3
ログのすべての行に常にタイムスタンプが含まれるわけではありません。一部の行にはタイムスタンプがまったく含まれていません。この問題をどのように克服しましたか?私は愚かなawkを使用し、時間の価値がないすべての行を見逃しました。この問題を回避する方法はありますか?
私の言葉はそんな意味でした。
2023-08-07 09:20:35 0123456789 INFO CustomerLogoutResource:95 - Entering logout api.
2023-08-07 09:20:35 0123456789 ERROR AppExceptionMapper:87 - Exception has been thrown by container
2023-08-07 09:20:35 0123456789 ERROR AppExceptionMapper:555 - Unchecked Exception
java.lang.NullPointerException
at NullPointerExceptionExample.printLength(NullPointerExceptionExample.java:3)
at NullPointerExceptionExample.main(NullPointerExceptionExample.java:8)
ベストアンサー1
10:00から11:00の間にログインがない場合、このメソッドはtoの行が見つから11:00
ず、13:00から14:00の間にログインがない場合、それ以降のすべての行が報告されます。少なくとも10〜11の間に1)。13:00
14:00
このような場合は、時間と範囲を語彙的に比較することをお勧めします。
たとえば、時間が3番目のフィールドにある場合:
awk '$3 >= "10:00:00" && $3 < "13:00:00"'
キュー内の時間がどこにあるかわからない場合は、次のことができます。
perl -lne 'print if /\b\d\d:\d\d:\d\d\b/ &&
$& ge "10:00:00" &&
$& lt "13:00:00"'
または:
LC_ALL=C awk 'match($0, /[0-2][0-9]:[0-5][0-9]:[0-5][0-9]/) && \
(t = substr($0, RSTART, 8)) >= "10:00:00" && \
t < "13:00:00"'
その範囲内のタイムスタンプを含むレポート行。タイムスタンプが指定された行の間にタイムスタンプが指定されていない行があり、それを報告したい場合は、beginning-condition, end-condition {action}
質問の方法を使用できますが、正規表現の一致ではなく比較を使用するか、手動状態遷移を実行して上限を除外することもできます。
LC_ALL=C awk -v beg=10:00:00 -v end=13:00:00 '
match($0, /[0-2][0-9]:[0-5][0-9]:[0-5][0-9]/) {
t = substr($0, RSTART, 8)
if (t >= end) selected = 0
else if (t >= beg) selected = 1
}
selected'