【问题标题】:Command line: monitor log file and add data to database命令行:监控日志文件并将数据添加到数据库
【发布时间】:2012-06-03 18:54:41
【问题描述】:

我正在监控一个日志文件。每一行的格式如下:

2012    5       29      14      20              438.815 872.737 -1.89976       -0.55156     8.68749 -0.497848       -0.54559                0       0       6      00       0       0       0               0       0       0       0       0      80       9               0       0       10      0       0       0       8      00       9       0       0       0       0       0       0               2      41       84      0       0       0       1       0

如您所见,每个值都由制表符分隔。

如何编写 Perl 脚本来获取每一行新数据(日志文件每十分钟更新一次)并将这些数据插入 MySQL 数据库?

我希望尽可能多地在命令行上执行此操作。

如果我使用tail -f -n 1 ./Eamorr.out > myPerlScript.pl,我的 perl 脚本会在每次附加文件时获取数据吗?

非常感谢,

【问题讨论】:

  • 必须是perl吗?您也可以只使用一个 shell 脚本以及您的数据库命令行客户端(mysql、psql 等)来执行此操作。

标签: linux perl unix command-line tail


【解决方案1】:

bash 中的另一种方法:

#!/usr/bin/perl -w

use strict;

$|++; # unbuffer output

open FH, "tail -f /var/log/syslog |";

while (<FH>) { chomp; print; }

在纯 shell 中没有 Perl:

tail -f /var/log/syslog |
    while read a; do
        echo "INSERT INTO FOOBAR VALUES($(
            sed "s/ /','/g; s/^/'/; s/$/'/" <<< "$a")
        );"
    done

【讨论】:

  • 完美运行。非常感谢!
  • 我建议使用tail -F 而不是-f,以防您的日志文件被轮换...
【解决方案2】:

如果这是您想要采用的方法,您需要一个管道,例如:

tail -f -n 1 ./Eamorr.out | myPerlScript.pl

myPerlScript.pl 读取传入行的位置如下:

while (<>) {
chomp;
print "Handling: $_\n";

}

【讨论】:

    猜你喜欢
    • 2018-07-16
    • 2020-11-20
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    相关资源
    最近更新 更多