2014-03-12 64 views
8

我需要循環槽n行的一個文件和任何i between 1 and n - 1得到差異line(n - 1) - line(n)連續行之間的Linux差異

這裏是源文件:

[email protected]:/var/www# cat cron.log | grep "/dev/vda" 
/dev/vda   20418M 14799M  4595M 77%/
/dev/vda   20418M 14822M  4572M 77%/
/dev/vda   20418M 14846M  4548M 77%/
/dev/vda   20418M 14867M  4527M 77%/
/dev/vda   20418M 14888M  4506M 77%/
/dev/vda   20418M 14910M  4484M 77%/
/dev/vda   20418M 14935M  4459M 78%/
/dev/vda   20418M 14953M  4441M 78%/
/dev/vda   20418M 14974M  4420M 78%/
/dev/vda   20418M 15017M  4377M 78%/
/dev/vda   20418M 15038M  4356M 78%/
[email protected]:/var/www# cat cron.log | grep "/dev/vda" | cut -b 36-42 | tr -d " M" 
4595 
4572 
4548 
4527 
4506 
4484 
4459 
4441 
4420 
4377 
4356 

那些/dev/vda...線與df -BM每小時登錄cron.log文件和行之間的差別將揭示每小時磁盤消耗。

因此,預期產出將是:

23 (4595 - 4572) 
24 (4572 - 4548) 
... 
43 (4420 - 4377) 
21 (4377 - 4356) 

我不需要()之間的文本,我把它放在這裏只是爲了說明。

回答

11

我不知道如果我沒有得到你,但以下awk腳本應該工作:

awk '{if(NR>1){print _n-$4};_n=$4}' your.file 

輸出:

23 
24 
21 
21 
22 
25 
18 
21 
43 
21 

不需要在其他程序管道。只是:

awk '/\/dev\/vda/ {if(c++>0){print _n-$4};_n=$4}' src/checkout-plugin/a.txt 

就足夠了。 awk腳本開始處的正則表達式告訴awk僅將以下塊應用於與模式匹配的行。副作用是NR不能再用於檢測計算開始的「第二行」。爲此我介紹了一個客戶櫃檯c

另請注意,awk將自行刪除M,因爲該列已用於數字計算。

+2

不錯的答案。你可以考慮顯示OP如何添加模式來選擇以'/ dev/vda'開始的行,這樣他就可以運行'awk'/^\/dev \/vda/....'OriginalLogFile,即不需要首先grep。 –

+0

@MarkSetchell當然,管道中的其他程序不是必需的。檢查我的更新。 – hek2mgl

+0

你得到我的投票:-) –