[英]awk to print header and lines matching specific criteria
我正在打印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來執行此操作,因為輸入之前的行數不會是固定的一。
因此,有什么簡單的方法可以打印$ 7或$ 8的值大於100的行,然后在找到的條目上方打印包含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
日志文件將在數千行中運行。
您需要在傳遞時將有趣的頭數據捕獲到變量中。 然后,當看到一堆有趣的行時,您需要選擇一次打印標題。 最后,您需要重置一個事實,即每次看到新日期時都打印標題。
您首選的語言是什么? 我不是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
}
'
這已經足夠接近我認為的要求。 調試可能需要應用!
我將使用以下內容:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.