awk在“if / else”语句中匹配两个模式

时间:2015-03-16 03:39:09

标签: if-statement awk output sar

我有一个awk问题,我似乎无法弄明白。我正在尝试解析来自SAR的数据,发现有些系统正在使用不同的语言环境而且我得到了不同的输出。长期解决方案是将输出数据的所有系统上的语言环境更改为相同的内容,但我现在必须解析旧数据,这当前不是一个选项。这是我得到的两种类型的数据:

24小时输出:

21:10:01          all      8.43      0.00      1.81      2.00      0.00     87.76
21:20:01          all      7.99      0.00      1.74      0.82      0.00     89.44
21:30:01          all      8.35      0.00      1.76      0.94      0.00     88.95

12小时输出:

09:10:01 PM         all      8.43      0.00      1.81      2.00      0.00     87.76
09:20:01 PM         all      7.99      0.00      1.74      0.82      0.00     89.44
09:30:01 PM         all      8.35      0.00      1.76      0.94      0.00     88.95

我需要一个awk声明,该声明将从7 AM-7PM获取所有SAR数据的项目。我最初有一些工作,但一旦我发现这个问题,它会打破所有24小时输出。我尝试使awk语句起作用,但以下方法不起作用,我无法弄清楚如何使其工作:

awk '{ if ($2 == "AM" || $2 == "PM" && /07:00/,/07:00/) print $1" "$2; else '/07:00/,/19:00 print $1}' SAR_OUTPUT_FILE.txt

基本上,我想输出的是,如果它是24小时格式,搜索07:00-19:00并返回第一列输出(因为没有“AM / PM”如果它找到了“AM / PM”,我会把这个12小时的格式设置为并且想要从07:00-07:00获得所有内容并返回第1和第2列(时间+“上午/下午”)。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

如果无法访问带时间函数的awk(strftime() or mktime()),您可以将12h结束时间移动,以便可以使用24小时时间测试进行测试。

这是一个awk可执行文件,通过调整12h格式化时间的小时数来适应24小时格式。结果将放入每行的变量t,并在24小时范围内进行测试。

#!/usr/bin/awk -f

function timeShift(       a, h ) {
    if(NF==9 && split($1, a, ":")==3) {
        if(a[1]==12)        h = $2=="PM"?"12":"00"
        else if($2=="PM")   h = (a[1]+12)%24
        else                h = a[1]
        return( h ":" a[2] ":" a[3] )
    }
    return( $1 )
}

{ t = timeShift() }

t >= "07:00:00" && t <= "19:00:00"

如果您需要打印的字段少于整行,则可以在最终表达后添加操作块。