0

Perl でログ ファイルを開き、正規表現を使用して必要なものを見つけ、「# 既知のエクスプロイト = [指紋一致] [PHP エクスプロイト [P0008]]:」というテキストの下にあるパスのみをリストします。

スクリプトには、次のパスのみをリストする必要があります。

/home/avocatma/public_html/raul/mambo/administrator/components/com_mynetwork/141163.php
/home/avocatma/public_html/raul/mambo/administrator/components/com_mynetwork/images/120541.php
/home/avocatma/public_html/raul/mambo/administrator/components/com_mynetwork/language/200724.php
/home/avocatma/public_html/raul/mambo/components/com_mynetwork/228469.php

元のログ ファイル

# Known exploit = [Fingerprint Match] [PHP Exploit [P0008]]:
'/home/avocatma/public_html/raul/mambo/administrator/components/com_mynetwork/141163.php'
# Known exploit = [Fingerprint Match] [PHP Exploit [P0008]]:
'/home/avocatma/public_html/raul/mambo/administrator/components/com_mynetwork/images/120541.php'
# Regular expression match = [symlink\s*\(]:
'/home/axacert/public_html/administrator/components/com_akeeba/akeeba/engines/archiver/jpa.php'
# Regular expression match = [symlink\s*\(]:
'/home/axacert/public_html/administrator/components/com_akeeba/akeeba/engines/archiver/zip.php'
# Regular expression match = [decode regex: 1]:
'/home/axacert/public_html/administrator/components/com_director/includes/stats.php'
# Known exploit = [Fingerprint Match] [PHP Exploit [P0008]]:
'/home/avocatma/public_html/raul/mambo/administrator/components/com_mynetwork/language/200724.php'
# Known exploit = [Fingerprint Match] [PHP Exploit [P0008]]:
'/home/avocatma/public_html/raul/mambo/components/com_mynetwork/228469.php'

私は基本的なperlのスキルを持っています。正規表現の使い方は知っていますが、文字列が文字列の下のパスのみをリストし、他には何もリストしないかどうかをperlに伝える方法がわかりません。

すべての提案を歓迎します。

4

3 に答える 3

0

これはあなたが求めているものを達成するはずです:

use warnings;
use strict; 
use File::Slurp;

my @file = read_file('test.txt'); # Read file into an array (you don't have to use file::slurp)
my $match=("# Known exploit"); # The thing you want to match on

for my $i (0 .. $#file) { # For each element in the array (each line) 
    print "$file[$i+1]" if ($file[$i] =~ /$match/); # Print the next line if the current line matches your match variable
}

出力:

'/home/avocatma/public_html/raul/mambo/administrator/components/com_mynetwork/141163.php'
'/home/avocatma/public_html/raul/mambo/administrator/components/com_mynetwork/images/120541.php'
'/home/avocatma/public_html/raul/mambo/administrator/components/com_mynetwork/language/200724.php'
'/home/avocatma/public_html/raul/mambo/components/com_mynetwork/228469.php'
于 2013-10-10T12:56:56.883 に答える
0

何を試しましたか?

前の行を常に変数に保持し、前の行が「必要なもの」と一致する場合にのみ現在の行を印刷できます。

スクリプトでは、次のようなものになります。

my $file, $line, $preline;
open($file, "<", "your_file") || die "can't open $file\n";
while (<>) {
    $preline = $line;
    $line = $_;
    if ($preline =~ /what_you_want/) {
        print $line;
    }
}

最初の試みを書くのに役立つことを願っています。これらのコード行に加えて、"strict" と "warnings" を使用することを忘れないでください! ;-)

于 2013-10-10T13:10:17.663 に答える