我正在打印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
日志文件将以数千行运行。
答案 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<=3
。 NR
代表记录数,通常是行数。因此,我们正在寻找低于或等于3的行号(打印标题)。所以我在当前脚本中添加的唯一内容是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