在 bash 中按月份、日期和时间过滤日志文件

在 bash 中按月份、日期和时间过滤日志文件

我想获取以下日志之间Apr 24 10:00:00.000000和其中的数据Apr 25 24:00:00.999999,但我不确定如何完成这项工作:

files/file1:Apr 22 02:47:00.663117 somedata    
files/file1:Apr 23 04:47:00.663127 somedata    
files/file1:Apr 24 05:47:00.663137 somedata    
files/file1:Apr 24 10:47:00.663137 somedata    
files/file1:Apr 25 01:47:00.663147 somedata    
files/file1:Apr 25 23:47:00.663157 somedata    
files/file1:Apr 25 23:47:00.663167 somedata    
files/file1:Apr 26 23:47:00.663177 somedata

我尝试使用以下命令,但这只会按时间过滤,也不考虑日期:

awk -v start=10:00:00.000000 -v stop=24:00:00.999999 'start <= $3 && $3 <= stop'

我只想获取以下数据:

files/file1:Apr 24 10:47:00.663137 somedata    
files/file1:Apr 25 01:47:00.663147 somedata    
files/file1:Apr 25 23:47:00.663157 somedata    
files/file1:Apr 25 23:47:00.663167 somedata

有人可以帮忙解决这个问题吗?此外,在过滤时考虑月份也非常有用

答案1

您可以非常简单地为日期过滤器添加更多变量:

awk -v start_day=24 -v stop_day=25 -v start_time=10:00:00.000000 -v stop_time=24:00:00.999999 'start_day <= $2 && $2 <= stop_day && start_time <= $3 && $3 <= stop_time' file

产量

files/file1:Apr 24 10:47:00.663137 somedata    
files/file1:Apr 25 23:47:00.663157 somedata    
files/file1:Apr 25 23:47:00.663167 somedata

我们错过了 4 月 25 日的线路,因为我们盲目地将时间过滤到上午 10 点以下。我们所要做的就是实现一个逻辑测试来过滤第一天的时间:

awk -v start_day=24 -v stop_day=25 -v start_time=05:00:00.000000 -v stop_time=05:00:00.999999 'start_day <= $2 && $2 <= stop_day && (start_time <= $3 || start_day != $2) && $3 <= stop_time' file

产量

files/file1:Apr 24 10:47:00.663137 somedata    
files/file1:Apr 25 01:47:00.663147 somedata    
files/file1:Apr 25 23:47:00.663157 somedata    
files/file1:Apr 25 23:47:00.663167 somedata 

几个月来,您可以遵循相同的想法,但您需要将 Apr 转换为 04(预处理或 awk 魔法?)并对其应用 <= => 。

相关内容