0

我正在尝试决定使用哪种语言来编写一个脚本,该脚本将从服务器应用程序中“抓取”日志文件。脚本的一般算法将类似于(当然仍然会散列所有小细节):

1. Search for any line that contains (ACK_STRING, PARTIAL_FILL_STRING, or COMPLETE_FILL_STRING) and not AUTO_HEDGER_STRING
2. For each result
{
    Extract time, order ID, symbol, status, theo, price from line

    Get intermediate edge value
        If buy, edge = (theo - price)
        Else, edge = (price - theo)

    If order ID not found in order ID -> orderquoteinfo structure
    {
        Add (edge * qty of order) to total edge
    }

    Add edge to total edge received
        Add (edge * qty filled) to total edge received

    Store info in order ID -> orderquoteinfo structure
}

3.
For each order ID -> orderquoteinfo structure
{
    Print results in CSV format

    Time, Order ID, Symbol, Status, B/S, Qty, Price, Theo, Edge
}

4. Print total edge missed
    Print total edge - total edge received

5. Print total edge received

因此,本质上,我想使用类似于 C++ 中的映射或 Perl 中的关联数组的数据结构来保存从日志文件的每一行中抓取的信息。我对 shell 脚本不太熟悉,但我想看看什么语言在这里有意义。我从中提取日志的服务器应用程序驻留在 Linux 服务器上(而且它很快就会被移植到另一个平台的可能性很小)。所以 Perl 的可移植性因素并没有在我的脑海中发挥作用。

对我来说,我只是更熟悉编写 Perl 脚本而不是 shell 脚本。但是,如果在这里这样做更有意义,我想编写一个 shell 脚本。该脚本将作为计划任务每​​天运行一次(给予或接受)。基本上,该脚本只是作为一种轻松从日志文件中获取指标数据的方式。我使用术语“抓取”是因为我将在日志文件中搜索最不可能更改但仍然存在风险的特定字符串。

那么,我应该编写一个 shell 脚本还是使用 Perl?什么更有意义?这里重要吗?

4

3 回答 3

3

Perl


Actually, I was tempted to say: "Shell or Perl? Easy, use Ruby", which is why subjective questions like this tend to get closed.

But a hopeless cause is somehow intriguing so I will attempt a serious answer: you can certainly write complicated things as shell code, but, compared to a real language like Perl, the effort is greater and the results are inferior.

Use Perl.

于 2012-12-18T23:43:21.253 回答
2

Perl 确实是您所需要的。毕竟 PERL 的意思是“实用提取和报告语言”。

来自维基百科:“Perl 最初是由 Larry Wall 在 1987 年开发的,作为一种通用的 Unix 脚本语言,以使报告处理更容易”。所以处理这种数据是 Perl 的第一个目标。它做得很完美。

使用 shell 脚本处理日志会比 Perl 和正则表达式更痛苦。

于 2012-12-18T23:41:37.300 回答
1

这是我用来实时监控我的网络服务器日志的脚本的一部分,我相信它可以很容易地重写来做你需要的事情。应该注意的是,File::Tail如果您只监视脚本中的一个日志文件,这可能是一个更好的选择。

此代码将读取包装在两个 while 循环中,其中内部 while 循环检查每个文件的新行,而外部 while 循环检查新文件。您可能想要使用其他东西,而不是while (1) { }让它实际移动。

#!/usr/bin/perl
use warnings;
use strict;
use File::Tail::Multi;

while (1)
{
        my $reloadtime = time();

        my $file=File::Tail::Multi->new(
                Function        =>      \&parseline,
                LastRun_File    =>      '/var/autoblock.runtrack',
                Files           =>      ["/var/log/www/*/access.log"],
                RemoveDuplicate =>      0,
                NumLines        =>      0,
        );

        while (1)
        {
                $file->read;
                sleep 2;
        }
        sleep 2;
}

sub parseline()
{
        my $ref = shift;
        foreach ( @{$ref})
        {
         # Do stuff with each line here. The line is stored in $_
        }
}
于 2012-12-19T04:05:29.127 回答