AWK报告格式

时间:2015-07-23 03:41:58

标签: bash awk gawk nawk

我有一个需要输出诊断结果的任务 - 是否通过“P”,失败“F”,停止“H”。至于在示例输入文件中找不到的cps_ck,它会给我“X”,意思是“未执行”。

示例输出

S----------------------------------------------S
S hss_ck | meter_ck | fan_ck | ovi_ck | cps_ck S
S----------------------------------------------S
S    F   |    F     |   H    |   P    |    X   S
S----------------------------------------------S

示例输入

这是日志文件的示例内容,我将提取“P”,“F”和“H”。它始终处于“dir to my diags”“result”“date”“time”的模式中。对于此日志文件,最后执行的诊断结束。另一个挑战是可能存在两个或更多“hss_ck.vti”结果,如下面的示例所示。我想得的只是最新的结果,样本数据中的“F”。

/home/bigdir/subdir/os/i686_linux_2.6.9/diags/hss_ck.vti  P  06-24-2015  21:00:12
/home/bigdir/subdir/os/i686_linux_2.6.9/diags/fan_ck.eva H 06-24-2015 21:00:35
/home/bigdir/subdir/os/i686_linux_2.6.9/diags/meter_ck.eva F 06-24-2015 21:01:16
/home/bigdir/subdir/os/i686_linux_2.6.9/diags/ovi_ck.eva P 06-24-2015 21:02:01
/HOME/smalldir/rrim/OVICAL/ovi_cal.eva P 06-24-2015 21:32:10
/home/bigdir/subdir/os/i686_linux_2.6.9/diags/hss_ck.vti  F  06-25-2015  01:00:12

我心中的想法是这样的:

  1. 搜索我想要的字符串。说“hss_ck”。
  2. 获得结果。应为“F”,因为它是“hss_ck”的最后一个条目。但是我不知道该怎么做才能得到“hss_ck”最后一个条目的结果。
  3. 将它放在一个数组中,其中我的元素就是结果。我的数组将包含“hss_ck的结果”,“meter_ck的结果”,“fan_ck的结果”,“ovi_ck的结果”,“cps_ck的结果”等元素。所以看起来像{F,F,H,P,X,}等等。
  4. 然后最后将数组放在/tmp/MyArrayIsHere
  5. 这样的文件中

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

Awk程序

awk 'BEGIN {
        o[1] = "hss_ck"; o[2] = "meter_ck"; o[3] = "fan_ck"; o[4] = "ovi_ck"; o[5] = "cps_ck"
        for (i = 1; i <= 5; i++) a[o[i]] = "X"
    }
    { x = $1; sub(/.*\//, "", x); sub(/\.[a-z]{3}$/, "", x); if (x in a) a[x] = $2; }
    END {
    print "S----------------------------------------------S"
    print "S hss_ck | meter_ck | fan_ck | ovi_ck | cps_ck S"
    print "S----------------------------------------------S"
    prefix = "S"
    for (i = 1; i <= 5; i++)
    {
        len = length(o[i]) / 2
        printf("%s%*s%s%*s", prefix, len, " ", a[o[i]], len+1, " ")
        prefix = "|"
    }
    printf "S\n"
    print "S----------------------------------------------S"
    }' data

概要

  1. 在序列中设置列名称(顺序,因此o),然后重新打印。
  2. 将数组a中的状态初始化为X(未执行)。
  3. 对于每一行输入,从$1中提取代码;如果代码是有趣的代码之一,请将$2的值保存在a中。最新值将覆盖之前的值。
  4. 打印表格标题(丑陋的格式,但这是问题的要求)。
  5. 对于每一行,按所需顺序打印状态值,小心对齐。请注意,它取决于代码的长度为6和8(均为偶数)。如果其中一个代码是奇数长度,你必须更加努力。没有那么难,但更难。另请注意,标题行可以从o中的数据生成,而不是硬编码。
  6. 完成输出。
  7. 示例数据

    /home/bigdir/subdir/os/i686_linux_2.6.9/diags/hss_ck.vti  P  06-24-2015  21:00:12
    /home/bigdir/subdir/os/i686_linux_2.6.9/diags/fan_ck.eva H 06-24-2015 21:00:35
    /home/bigdir/subdir/os/i686_linux_2.6.9/diags/meter_ck.eva F 06-24-2015 21:01:16
    /home/bigdir/subdir/os/i686_linux_2.6.9/diags/ovi_ck.eva P 06-24-2015 21:02:01
    /HOME/smalldir/rrim/OVICAL/ovi_cal.eva P 06-24-2015 21:32:10
    /home/bigdir/subdir/os/i686_linux_2.6.9/diags/hss_ck.vti  F  06-25-2015  01:00:12
    

    示例输出

    S----------------------------------------------S
    S hss_ck | meter_ck | fan_ck | ovi_ck | cps_ck S
    S----------------------------------------------S
    S   F    |    F     |   H    |   P    |   X    S
    S----------------------------------------------S