解析 FTP 日志中的字节计数



我正在运行一个 arm 架构。应该是一个 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)

现在我需要获取"("之后和单词"bytes"之前的值并添加它们。

  • 例:
-

->下载 423+904753213=904753636 => 返回值:904753636

-

->上传576711530 => 返回值:576711530

现在脚本将每 5 分钟运行一次,因此结果必须仅考虑过去 5 分钟之间的数字。例:在 22:05 脚本运行并添加所有字节。当脚本在 22:10 再次运行时,只应添加 22:05 到 22:10 之间的传输字节。

对于 rrd,您需要一个简单的输出,2 个变量"下载"和"上传"。所以我将需要这 2 个变量中的这两个值。

我希望我足够清楚,如果不是,请毫不犹豫地询问更多信息。

非常感谢您的帮助。

有很多方法可以做到这一点。这个很有趣:

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),然后您可以使用尾巴仅附加部分。

这个版本对格式很严格。即使某些部分会像在文件 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=%dnuploaded=%dn", 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=%dnuploaded=%dn",d,u)}' file

要在 bash 脚本上运行它,请通过进程替换将 awk 作为输入运行,将格式更改为 "%dn%dn" 并读取包含两个变量的两行:

#!/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("%dn%dn",d,u)}' file)
echo "Downloaded: $downloaded"
echo "Uploaded: $uploaded"