正则表达式中使用的Perl命令行参数

时间:2015-11-08 04:25:13

标签: regex perl

给定文本文件中的各种字符串,格式为:

199.72.81.55 - - [01/Jul/1995:00:00:01 -0400] "GET /history/apollo/ HTTP/1.0" 200 6245

我试图从命令行中读取一个数字,如下所示:

type small_access_log_Jul95_01.txt | perl FLTR_WLOG_STATUS_CODES.pl 200

“small_access_log”txt文件包含每行上给出的格式行。我在阅读中使用参数“200”时遇到了麻烦,因为它似乎将200分配为第一个参数。 这是我正在处理的代码:

use strict;
use warnings;


while ( <> ) {

 if ($_ =~ /"[$ARGV[1]]"/){
 print $_;}

 }

只应打印包含“200”的行或通过命令行输入的任何内容。

这是python中的工作版本:

import sys
import re

TEXT = sys.argv[1]
for n in [x for x in sys.stdin.readlines() if re.search(".*?"+re.escape(TEXT) +"\s([0-9]+)$",x)]:
    print n

那么我需要用perl中的命令行做些什么来使其工作呢?

2 个答案:

答案 0 :(得分:3)

Perl程序的第一个参数位于$ARGV[0],空菱形运算符从@ARGV

中指定的文件中读取数据

你需要像这样写你的程序。它在循环中使用之前从@ARGV的末尾删除了pattern参数,并利用Perl的$_变量作为许多运算符的默认参数

正则表达式中的\Q强制所有后续的非字母数字字符被转义,因此按字面意思进行转义。这包括方括号和$pattern内容,否则可能被视为具有特殊含义的正则表达式元字符

use strict;
use warnings;

my $pattern = pop @ARGV;

while ( <> ) {
    print if /\Q[$pattern]/;
}

你应该像这样运行

perl FLTR_WLOG_STATUS_CODES.pl small_access_log_Jul95_01.txt 200

更新

如果您被迫接受来自STDIN而不是命令行文件名的数据输入,那么您需要这样做

use strict;
use warnings;

my $pattern = pop @ARGV;

while ( <STDIN> ) {
    print if /\Q[$pattern]/;
}

你应该像这样运行

type small_access_log_Jul95_01.txt | perl FLTR_WLOG_STATUS_CODES.pl 200

答案 1 :(得分:1)

使用命令行:

perl FLTR_WLOG_STATUS_CODES.pl small_access_log_Jul95_01.txt 200

代码如下:

#!/usr/bin/perl
use strict;
use warnings;

my $arg = pop;

while (<>) {
    print if /\[$arg\]/;
}