Командная строка: отслеживать файл журнала и добавлять данные в базу данных

Я отслеживаю файл журнала. Каждая строка имеет следующий формат:

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-скрипт получать данные каждый раз, когда файл добавляется?

Спасибо заранее,


person Eamorr    schedule 29.05.2012    source источник
comment
Это должен быть перл? Вы также можете сделать это, используя только сценарий оболочки вместе с клиентом командной строки вашей базы данных (mysql, psql и т. д.).   -  person ghoti    schedule 29.05.2012


Ответы (2)


Другой подход в bash:

#!/usr/bin/perl -w

use strict;

$|++; # unbuffer output

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

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

Без Perl в чистой оболочке:

tail -f /var/log/syslog |
    while read a; do
        echo "INSERT INTO FOOBAR VALUES($(
            sed "s/ /','/g; s/^/'/; s/$/'/" <<< "$a")
        );"
    done
person Gilles Quenot    schedule 29.05.2012
comment
Работает отлично. Большое спасибо! - person Eamorr; 29.05.2012
comment
Я рекомендую использовать tail -F вместо -f на тот случай, если ваш файл журнала будет ротироваться... - person ghoti; 29.05.2012

Если это подход, который вы хотите использовать, вам нужен конвейер, например:

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

где myPerlScript.pl читает входящие строки, например:

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

}

person JRFerguson    schedule 29.05.2012