Linux连续行之间的差异

10

我需要循环遍历文件的 n 行,并对于任何 i(1≤i≤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... 行会在 cron.log 文件中每小时记录一次,使用命令 df -BM,而行之间的差异将揭示出每小时的磁盘消耗。

因此,预期输出结果为:

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

我不需要()之间的文本,我只是为了解释而放在这里。

1个回答

17

我不确定我是否理解正确,但是以下的 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。 - Mark Setchell
@MarkSetchell 确定,管道中的其他程序不是必需的。请查看我的更新。 - hek2mgl
不错,给你和@MarkSetchell点赞。还有一件事要做:我期望从10行输入中得到9行输出。如果你能做到,我会将你的答案标记为被接受的。到目前为止,谢谢。 - SYNCRo
1
是的,那个(C++)完成了它的工作 :) ... 谢谢,问题解决了! - SYNCRo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接