awk打印标题和符合特定条件的行

时间:2014-11-25 13:55:13

标签: bash perl shell awk sed

我正在打印iostat或类似的输出:

[/] # iostat -xnCT d 5 5
Tue Nov 25 13:45:56 2014
                    extended device statistics
    r/s    w/s   kr/s   kw/s wait actv wsvc_t asvc_t  %w  %b device
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    3.1   0   0 c0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    3.1   0   0 c0t0d0
    0.1    2.7    1.6    4.8  0.0  0.0    0.1    433.2   0   0 c1
    0.1    2.7    1.5    4.8  0.0  0.0    0.1    3.3   0   0 c1t0d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    100.1   0   0 c1t1d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c1t2d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.5   0   0 c1t3d0
    0.1    0.1    0.1    0.0  0.0  0.0    0.0    600.0   0   0 c2
    0.0    0.0    0.0    0.0  0.0  0.0    185.0    0.0   0   0 c2t0d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c2t1d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.1   0   0 c2t4d0
    0.0    0.0    0.0    0.0  0.0  0.0    295.0    0.0   0   0 c2t5d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.1   0   0 c2t6d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c2t8d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c2t9d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c2t10d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.1   0   0 c2t11d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c2t12d0
    0.1    0.1    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c3
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c3t0d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c3t1d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c3t2d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c3t3d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c3t4d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c3t5d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c3t6d0
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    0.0   0   0 c3t8d0

我生成这些日志,然后使用脚本打印出信息。现在,我正在研究一些性能脚本,例如,我需要grep从日志文件中获得平均服务时间较长的值,这些日志文件始终生成并查看大于100的实例值。

所以这就是我能做的:

awk '$7 > 100 || $8 > 100' filename

所以我将获得所有具有wsvc_t和asvc_t值的条目大于100.注意,这只是一个例子。但是,我也想在发生这种情况时打印日期,使用grep -B无法完成,或者我不知道如何使用sed或awk来执行此操作,因为条目之前的行数不会是固定的一。

这样有一种简单的方法可以打印价格大于100的行,价格为7美元或8美元,然后在找到的条目上方打印2014年或年份的行吗?

所以我的结果应该是这样的:

Tue Nov 25 13:45:56 2014
                    extended device statistics
    r/s    w/s   kr/s   kw/s wait actv wsvc_t asvc_t  %w  %b device
    0.1    2.7    1.6    4.8  0.0  0.0    0.1    433.2   0   0 c1
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    100.1   0   0 c1t1d0
    0.1    0.1    0.1    0.0  0.0  0.0    0.0    600.0   0   0 c2
    0.0    0.0    0.0    0.0  0.0  0.0    185.0    0.0   0   0 c2t0d0
    0.0    0.0    0.0    0.0  0.0  0.0    295.0    0.0   0   0 c2t5d0

日志文件将以数千行运行。

2 个答案:

答案 0 :(得分:1)

您需要在传递过的时候将有趣的标题数据捕获到变量中。然后,当看到一堆有趣的线条时,你需要选择打印一次标题。最后,您需要重置每次看到新日期时已打印标题的事实。

您的首选语言是什么?我不了解awk目前关于模式的能力;当我开始使用Perl时,我停止了照顾。所以这里有一些我没有测试过的Perl代码:

source-process-feeding-lines | perl -n -e '
    if(/^(\w+ \w+ \d+ \d+:\d+:\d+ \d+)$/) {
        $date = $1;
        $header1 = $header2 = $printed = undef;    # reset heading state
        continue;    # next line please
    }

    if(/extended device statistics/) {
        $header1 = $_;
        continue;
    }

    if(/^(\s*\w\/\w.*device)$/ {   # simple but probably sufficient recogniser
        $header2 = $_;
        continue;
    }

    # assume a data line here
    if(/your pattern for an interesting line/) {
        if(! $printed) {
            $printed = 1;     # prevent a 2nd printing unless the date changes
            print $date, $header1, $header2;
        }

        print;    # print your interesting line
    }
'

这与我认为你所要求的相近。调试可能需要应用!

答案 1 :(得分:1)

我会使用以下内容:

awk 'NR<=3 || $7 > 100 || $8 > 100'

这将打印符合以下任一条件的行:

  • NR<=3NR代表记录数,通常是行数。因此,我们正在寻找低于或等于3的行号(打印标题)。
  • 第7个字段严格大于100.这就是你已经拥有的。
  • 第8个字段严格大于100.这就是你已经拥有的。

所以我在当前脚本中添加的唯一内容是NR<=3,这在我们确切地知道要打印的行号时非常有用,就像现在一样。

测试

将您的输入存储为文件:

$ awk 'NR<=3 || $7 > 100 || $8 > 100' file
Tue Nov 25 13:45:56 2014
                    extended device statistics
    r/s    w/s   kr/s   kw/s wait actv wsvc_t asvc_t  %w  %b device
    0.1    2.7    1.6    4.8  0.0  0.0    0.1    433.2   0   0 c1
    0.0    0.0    0.0    0.0  0.0  0.0    0.0    100.1   0   0 c1t1d0
    0.1    0.1    0.1    0.0  0.0  0.0    0.0    600.0   0   0 c2
    0.0    0.0    0.0    0.0  0.0  0.0    185.0    0.0   0   0 c2t0d0
    0.0    0.0    0.0    0.0  0.0  0.0    295.0    0.0   0   0 c2t5d0