连续行之间的Linux差异

SYN*_*CRo 8 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
Run Code Online (Sandbox Code Playgroud)

这些/dev/vda...行每小时df -BMcron.log文件中记录,行之间的差异将显示每小时磁盘消耗.

所以,预期的产出将是:

23 (4595 - 4572)
24 (4572 - 4548)
...
43 (4420 - 4377)
21 (4377 - 4356)
Run Code Online (Sandbox Code Playgroud)

我不需要的文本(),我把它放在这里仅用于说明.

hek*_*mgl 12

我不确定我是否正确,但以下awk脚本应该有效:

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

输出:

23
24
21
21
22
25
18
21
43
21
Run Code Online (Sandbox Code Playgroud)

不需要管道中的其他程序.只是:

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

就足够了.awk脚本启动时的正则表达式告诉awk仅将以下块应用于与模式匹配的行.副作用是NR不能再用于检测计算开始的"第二行".我c为此目的介绍了一个客户柜台.

另请注意,awk将删除M它自己,因为该列已用于数值计算.

  • 很好的答案.您可以考虑显示OP如何添加模式以选择以`/ dev/vda`开头的行,这样他就可以运行`awk'/ ^\/ dev\/ vda/....'OriginalLogFile,即无需他先grep. (2认同)