我正在使用手臂架构。 应该是一个bash脚本。 我想绘制来自我的ftp服务器的总字节数。
我使用此命令解析ftp.log文件以获取此输出:
`cat ftp.log | grep loaded`
有趣的线条采用以下格式:
Sep 14 18:46:00 sharecenter pure-ftpd: (doc@omega) [NOTICE] /mnt/HD/HD_a2//SAVE/backupffp.sh downloaded (423 bytes, 0.78KB/sec)
Sep 15 22:06:47 sharecenter pure-ftpd: (doc@omega) [NOTICE] /mnt/HD/HD_a2//SAVE/ffp-2013-09-14.tar.bz2 downloaded (904753213 bytes, 1928.17KB/sec)
Sep 15 22:32:26 sharecenter pure-ftpd: (doc@omega) [NOTICE] /mnt/HD/HD_a2//SAVE/test.avi uploaded (576711530 bytes, 1465.80KB/sec)
现在我需要在“(”之前和“字节”之前获取值并添加它们。
- >已下载423 + 904753213 = 904753636 =>返回值:904753636
- >已上传576711530 =>返回值:576711530
现在脚本将每5分钟运行一次,因此结果只需考虑最后5分钟之间的数字。 例: 在22:05脚本运行并添加所有字节。当脚本在22:10再次运行时,只应添加22:05到22:10之间的传输字节。
对于rrd,您需要一个简单的输出,2个变量“dowloaded”和“uploaded”。 所以我将在这两个变量中需要这两个值。
我希望我足够清楚,如果不是毫不犹豫地要求提供更多信息。
非常感谢你的帮助。
答案 0 :(得分:0)
此版本对格式要求严格。即使某些部分会添加文件URL中的空格,它也会起作用。
#!/usr/bin/awk -f
BEGIN {
u = d = 0
}
match($0, / downloaded \([0-9]+/) {
d += substr($0, RSTART + 14, RLENGTH - 14)
next
}
match($0, / uploaded \([0-9]+/) {
u += substr($0, RSTART + 12, RLENGTH - 12)
}
END {
printf("downloaded=%d\nuploaded=%d\n", d, u) ## You can change this to have desired format of output.
}
输出:
> awk -f script.awk file
downloaded=904753636
uploaded=576711530
简明格式:
awk 'BEGIN{u=d=0}match($0,/ downloaded \([0-9]+/){d+=substr($0,RSTART+14,RLENGTH-14);next}match($0,/ uploaded \([0-9]+/){u+=substr($0,RSTART+12,RLENGTH-12)}END{printf("downloaded=%d\nuploaded=%d\n",d,u)}' file
要在bash脚本上运行它,通过进程替换运行awk作为输入,将格式更改为"%d\n%d\n"
并读取包含两个变量的两行:
#!/bin/bash
{ read downloaded; read uploaded; } < <(exec awk 'BEGIN{u=d=0}match($0,/ downloaded \([0-9]+/){d+=substr($0,RSTART+14,RLENGTH-14);next}match($0,/ uploaded \([0-9]+/){u+=substr($0,RSTART+12,RLENGTH-12)}END{printf("%d\n%d\n",d,u)}' file)
echo "Downloaded: $downloaded"
echo "Uploaded: $uploaded"
答案 1 :(得分:0)
有很多方法可以做到这一点。这个很有趣:
for i in $(grep -P -o '(?<=downloaded \()[0-9]+(?= bytes)' file.txt); do ((downloaded+=i)); done
echo "Downloaded: $downloaded"
现在脚本将每5分钟运行一次,因此结果只需要考虑最近5分钟之间的数字。
还有很多方法可以做到这一点。其中一个是使用tail -f
而不是每5分钟运行一次。另一个是记住文件行数(例如使用wc -l
)然后你可以使用tail来获取附加部分。