如何在两个或多个日志文件中两次提取数据

时间:2016-06-20 10:25:47

标签: bash unix awk

我有两个日志文件,即Log1.log和Log2.log,每个都包含以下数据。

Log1.log:
Apr 10 02:07:20  Data 1
May 10 04:11:09  Data 2
June 11 06:22:35  Data 3
Aug 12 09:08:07  Data 4

Log2.log
Apr 10 09:07:20  Data 1
Apr 10 10:07:10  Data 2
Jul 11 11:07:30  Data 3
Aug 18 12:50:40  Data 4

我可以用什么命令在4月10日02:07:20到8月18日12:50:40之间获取数据。

我用过

$ awk -v start=01:06:04 -v stop=01:07:16 'start <= $3 && $3 <= stop' Log1.log Log2.log

我也用过

awk -v StartTime="$StartTime" -v EndTime="$EndTime" -f script.sh Log1.log Log2.log 

其中script.sh包含,

BEGIN { Keep = 0;}
{
if($3 >= StartTime)
{
    keep = 1;
}
if ($3 > EndTime) 
{
    exit;
}

if(keep)
{ 
     print;
}

}

我没有得到理想的结果。有人可以帮我提高答案吗?先谢谢

1 个答案:

答案 0 :(得分:0)

我首先使用sort对输入进行排序。然后我会使用sed来提取该范围:

LC_TIME=C sort -t' ' -k1,1M -k2,3n 1.log 2.log \
    | sed -n '/Apr 10 02:07:20/,/Aug 18 12:50:40/p'

顺便说一句,如果您想要排除或包含范围边界,我并不完全清楚。上面的例子包括它们,下面的例子将它们排除在外:

LC_TIME=C sort -t' ' -k1,1M -k2,3n 1.log 2.log \
    | sed -n  '/Apr 10 02:07:20/,/Aug 12 09:08:07/{/Apr 10 02:07:20/!{/Aug 12 09:08:07/!p}}

至少GNU sed允许将后一个命令简化为:

LC_TIME=C sort -t' ' -k1,1M -k2,3n 1.log 2.log \
    | sed -n  '/Apr 10 02:07:20/,/Aug 12 09:08:07/{//!p}'