连续行之间的Linux差异

时间:2014-03-12 10:29:42

标签: linux bash line difference

我需要循环播放文件的n行和任何i between 1 and n - 1行以获得差异line(n - 1) - line(n)

这是源文件:

root@syncro:/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% /
root@syncro:/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)

我不需要()之间的文字,我只是在这里解释。

1 个答案:

答案 0 :(得分: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,因为该列已用于数值计算。