从文件中删除某些行

时间:2013-12-12 10:52:52

标签: perl cgi

我已经将运行RKHunter的输出生成到一个文件中,如下所示:

[04:59:24] 55808 Trojan - Variant A [ Not found ]
[04:59:24]
[04:59:24] ADM Worm [ Not found ]
[04:59:24]
[04:59:25] AjaKit Rootkit [ Not found ]
[04:59:25]

我试图过滤掉不需要的输出,到目前为止这是我的代码:

open(my $fh,$this_log);
{       while (my $line = <$fh>)
        {
                chomp $line;
                $line_ctr++;
                if ($line_ctr < 55)
                {       next;
                }
                if (index($line, "Checking") != -1)
                {       next;
                }
                if (index($line, "Info") != -1)
                {       next;
                }
                print "$line<br>";
        }
}
close $fh;

注意不包含任何内容的备用行。我该如何去除它们?

4 个答案:

答案 0 :(得分:1)

它们不包含任何内容,它们包含[时间]部分。尝试类似if (length($line)==10) { next; }的内容。您可能需要将10更改为11,具体取决于时间背后是否存在不可见空间。

答案 1 :(得分:1)

  

过滤掉不需要的输出

如果这只是你想要的,如果你对sed没问题,那么这里不那么专业尚未解决的问题:

sed -r -i '/^\[[0-9]{2}:[0-9]{2}:[0-9]{2}\]$/d' <your_file_name>

这里是perl方式:

perl -i -n -e 'print unless /^\[\d{2}:\d{2}:\d{2}\]$/' <your_file_name>

答案 2 :(得分:1)

您可以使用以下内容保留包含字母字符(消息)的行:

use strict;
use warnings;

while (<>) {
    print if /[a-z]+/i;
}

命令行用法:perl script.pl inFile [>outFile]

最后一个可选参数将输出定向到文件。

数据集输出:

[04:59:24] 55808 Trojan - Variant A [ Not found ]
[04:59:24] ADM Worm [ Not found ]
[04:59:25] AjaKit Rootkit [ Not found ]

或者您可以使用以下方法创建原始文件的备份(inFile.bak):

perl -i.bak -ne 'print if /[a-z]+/i;' inFile

希望这有帮助!

答案 3 :(得分:0)

这有点粗糙,但您可以在处理中加入split

#! /usr/bin/perl

use strict;
use 5.0100;

my @input = ( '[04:59:24] 55808 Trojan - Variant A [ Not found ]', '[04:59:24]', '[04:59:24] ADM Worm [ Not found ]', );

foreach my $line ( @input ) {
  my @splits = split( / /, $line );

  if ( scalar( @splits ) == 1 ) {
    say "That must have been an empty line ($line)";
  }
}