如何从unix中的不同月份的日志文件中获取数据?

时间:2016-07-05 05:12:55

标签: bash unix awk sed

我想在不同月份和日期的日志文件中两次获取数据。假设我的startime不在日志文件中,那么我想从日志文件中最近的时间提取数据。如果日志文件中没有输入的结束时间,它也必须在结束时间之前结束。

我的日志文件数据

Apr 10 16 02:07:20  Data 1
Apr 11 16 02:07:20  Data 1
May 10 16 04:11:09  Data 2
May 12 16 04:11:09  Data 2
Jun 11 16 06:22:35  Data 3
Jun 12 16 06:22:35  Data 3

我正在使用的解决方案是,

awk -v start="$StartTime" -v stop="$EndTime" 'start <= $StartTime && $EndTime <= stop' $file

其中,我将我的开始时间存储在$StartTime和结束时间$EndTime但我没有得到确切的输出。请帮忙。

1 个答案:

答案 0 :(得分:1)

这样的事情可能是:

$ BashVarStart="16 05 10 00 00 00" # the same format that awk function will reformat to
$ BashVarStop="16 06 11 00 00 00"
$ awk -v start="$BashVarStart" -v stop="$BashVarStop" -F"[ :]" -v OFS=\  '
function reformatdate(m,d,y,h,mm,s) { # basically throw year to the beginning
  monstr="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec";   # numerize the months
  split(monstr,monarr," ");           # split monstr to an array to enumerate the months
                                      # monarr[1]="Jan", monarr[2]="Feb" etc
  for(i in monarr) {                  # iterate over all month numbers in monarr index
    if(monarr[i]==m)                  # when month number matches
      m=sprintf("%02d",i)             # zeropad if month number below 10: 9 -> 09
  }; 
  return y" "m" "d" "h" "mm" "s       # return in different order   
} 
start < reformatdate($1,$2,$3,$4,$5,$6) && stop > reformatdate($1,$2,$3,$4,$5,$6)
' test.in
May 10 16 04:11:09  Data 2
May 12 16 04:11:09  Data 2