给定文本文件中的各种字符串,格式为:
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中的命令行做些什么来使其工作呢?
答案 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\]/;
}