簡體   English   中英

awk打印符合特定條件的標題和行

[英]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(以打印標題)。
  • 第七場嚴格大於100。這就是您已經擁有的。
  • 第八場嚴格大於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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM