格式为“hh:mm:ss”的$ 1时的Grep文件介于某个范围之间

时间:2013-10-17 15:11:16

标签: bash shell scripting awk grep

我想要做的是,当每行中的第一个元素(“hh:mm:ss”格式)在两小时之间时,找出我文件中的所有条目

文件格式:

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 .....}' 

之后我想打印整行。有人可以告诉我如何在命令行中进行条件过滤?

感谢。

3 个答案:

答案 0 :(得分: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

我也看到你在gre 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 >=40hour 15 + minute == 0

答案 1 :(得分: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

答案 2 :(得分: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