首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >perl regex mach和list

perl regex mach和list
EN

Stack Overflow用户
提问于 2013-10-10 12:54:17
回答 3查看 353关注 0票数 0

我希望一个用perl打开一个日志文件,使用regex查找我想要的内容,然后只列出文本下面的路径"#知名开发=指纹MatchPHP剥削P0008]:

sript应该只列出这条路径:

代码语言:javascript
复制
/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

原始日志文件

代码语言:javascript
复制
# 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技能,我知道如何使用regex,但我不知道如何告诉perl,如果string只列出字符串下面的路径和nothig nothig。

欢迎所有建议。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-10 12:56:56

这应该能达到你所追求的目标:

代码语言:javascript
复制
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
}

输出:

代码语言:javascript
复制
'/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'
票数 0
EN

Stack Overflow用户

发布于 2013-10-10 12:59:43

试一试

代码语言:javascript
复制
perl -ne'
  BEGIN{ ($m) = map qr/$_/, quotemeta pop }
  print if $ok;
  $ok = /$m/;
' logfile "# Known exploit = [Fingerprint Match] [PHP Exploit [P0008]]:"

它将打印逐行匹配的# Known exploit = [Fingerprint Match] [PHP Exploit [P0008]]:

票数 2
EN

Stack Overflow用户

发布于 2013-10-10 13:10:17

你试过什么?

您可以始终将前一行保存在变量中,并且只有在前一行与“您想要的内容”匹配时才打印当前行。

在脚本中,它可能类似于:

代码语言:javascript
复制
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;
    }
}

我希望写第一次尝试会有帮助。除了这些代码行外,不要忘记使用“严格”和“警告”!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19296318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档