我想要做的是,当每行中的第一个元素(“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 .....}'
之后我想打印整行。有人可以告诉我如何在命令行中进行条件过滤?
感谢。
答案 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 >=40
或hour 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