【发布时间】:2018-02-23 05:51:25
【问题描述】:
如何使用 awk 读取值,并使用前面的值和后面的值来计算并将其添加到每行的附加列中:
示例 test.log:
$1 $2 $3 $4 $5 $6
2018/02/21 14:00:24 911 848 958 719
2018/02/21 14:00:34 978 848 998 966
第 7 列:
$1 $2 $3 $4 $5 $6 $7
2018/02/21 14:00:24 911 848 958 719 0.0
2018/02/21 14:00:34 978 848 998 966 0.45
第 7 列应由以下函数计算:
(($3-prev3)+($5-prev5))/240 = ((978-911)+(998-958))/240
日志文件第一行第7列只能有0.0!
我的问题是我想将第 7 列即时添加到日志文件中,而不是在日志记录完成后仅作为打印输出:
awk '{a=$3;b=$5;getline;print(($3-a)+($5-b))/240}' test.log
我该怎么做? 是否有可能在当前行并存储在先前值的变量中?
创建包含 6 列的日志文件的单行程序应动态添加具有上述计算的第 7 列:
while true; do echo `date +"%Y/%m/%d %H:%M:%S"` "#" `echo $RANDOM` "#" `echo $RANDOM` "#" `echo $RANDOM` "#" `echo $RANDOM` | awk -F# '{printf "%-20s %-15s %-15s %-15s %-15s\n",$1,$2,$3,$4,$5}'>>test.log; sleep 10; done
这个尝试也不起作用,因为它总是在第 7 列添加 0:
awk -F# '{a=$3;b=$5;printf "%-20s %-15s %-15s %-15s %-15s %-15s\n",$1,$2,$3,$4,$5,(($3-a)+($5-b))/240}'
我假设 a,b 的值与 $3 和 $5 相同,而不是之前的值!
测试日志:
2018/02/22 03:37:12 10241 29132 3358 17816 0
2018/02/22 03:37:17 12464 21254 16716 10024 0
一个带有 awk 脚本的解决方案,但它不是即时解决方案:
awk '{a=$3;b=$5;getline;print(($3-a)+($5-b))/240}' test.log
这只会将计算作为输出!
谢谢
【问题讨论】:
-
您是否在问是否可以创建一个工具来修改它正在读取的文件,同时该文件也正在被其他进程写入?
-
您必须通过 awk 管道输出才能做到这一点。
your-log-producer | awk '[your calculations]' > test.log -
是的,@EdMorton,正确我需要一些额外的 awk 行或其他工具来修改原始日志文件,并在第 7 列进行计算。我将添加一些有关使用数字创建日志文件的单行器的更多信息!
标签: awk