1

私がやりたかったのは、「hh:mm:ss」形式の各行の最初の要素が2時間の間にあるときに、ファイル内のすべてのエントリを見つけることです

ファイル形式:

14:40:00 user1 load xxxx xxxx xxxxx
14:40:02 user2 change xxx xxx xxxxx
15:03:04 user1 change xxx xxx xxxxx
so on...

14:40:00 から 15:00:00 までのすべてのエントリを取得したいと思います。

私は次のコマンドでそれを行うことを考えていましたが、フィッターでどのようにフォローできるかわかりません。

cat app.log | grep change | awk '{print $1 if .....}' 

その後、行全体を印刷したいと思います。コマンドラインで条件付きフィルターを実行する方法を誰かに教えてもらえますか?

ありがとう。

4

3 に答える 3

4

これは次の方法です。

$ awk -F: '($1==14 && $2>=40) || ($1==15 && $2==0)' file
14:40:00 user1 load xxxx xxxx xxxxx
14:40:02 user2 change xxx xxx xxxxx

grep しているのもわかりますchange。あなたはそれをすべて一緒に行うことができます:

$ awk -F"[: ]" '/change/ && (($1==14 && $2>=40) || ($1==15 && $2==0))' app.log
14:40:02 user2 change xxx xxx xxxxx

説明

  • -F"[: ]"スペースまたは:フィールド区切り文字を設定します。をそのまま使用できるため、完全に必要というわけではありませんが、必要に応じて-F:残りのフィールドで「遊ぶ」ことができます。
  • '($1==14 && $2>=40) || ($1==15 && $2==0)'一致する可能性のある条件:hour 14 + minute >=40またはhour 15 + minute == 0.
于 2013-10-17T15:15:10.197 に答える
3
awk '"14:40:00" <= $1 && $1 <= "15:00:00"' app.log

開始時刻と終了時刻を動的に渡したい場合:

start=14:40:00 
end=15:00:00
awk -v start=$start -v end=$end 'start <= $1 && $1 <= end' app.log

あなたが示すように、「変更」イベントのみが必要な場合:

awk -v start=$start -v end=$end 'start <= $1 && $1 <= end && /change/' app.log
awk -v start=$start -v end=$end 'start <= $1 && $1 <= end && $3 == "change"' app.log
于 2013-10-17T15:21:44.943 に答える
1

perl では次のようになります。

perl -n -e '/(\d\d:\d\d:\d\d) \S+ (\S+) / && $2 eq "change" && $1 ge "14:40:00" && $1 le "15:00:00" && print $_' < app.log

またはもう少し読みやすい:

perl -n -e '/(\d\d:\d\d:\d\d) \S+ (\S+) / ' \
    -e '&& $2 eq "change" ' \
    -e '&& $1 ge "14:40:00" ' \
    -e '&& $1 le "15:00:00" ' \
    -e '&& print $_' < app.log
于 2013-10-17T15:16:20.547 に答える