1

我想要做的是,当每行中的第一个元素(格式为“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 之间获取所有条目。

我想用以下命令来做,但我不知道如何使用 fiter。

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

我也看到你在 grepping 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
于 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 回答