2013-04-26 168 views
1

我在HP-UX服务器上不断更新大量日志文件。我创建了Perl代码来查找日志文件的名称,其中字符串i' m使用驻留在里面。 的Perl采用分体式获取文件名,并将其传递到variable.Using我创建的启动和停止的字符串作为两个variables.Such作为userinput:在Perl中使用awk解析两个字符串之间的所有内容

my $ssh = Net::OpenSSH->new($host, user => $user, 
     master_opts => [ -o => 'NumberOfPasswordPrompts=1', 
         -o => 'PreferredAuthentications=keyboard-interactive,password'], 
login_handler => \&login_handler); 

$ssh-> error and die "Unable to connect" . $ssh->error; 
my $output=$ssh->capture("grep .$userinput1. /app/bea/user_projects/domains/granite/om_ni.log*"); 

my $array = (split ":", $output)[0]; 
print "$array"."\n"; 

[编辑]:正如你们的要求,以上是在$数组是怎么填in.Below之初就是awk的顺序开始:

my $a= "INFO - $userinput1";print $a; 
my $b= "INFO - ProcessNode terminated... [$userinput1]";print $b; 

使用AWK如SSH捕获命令的一部分,它会通过整个日志文件搜索和捕捉之间每行字符串$ a和字符串$ b,然后获取另一个数组中的所有内容。例如:

my $output2=$ssh->capture("awk -v i=$array '$a,$b' i"); 

这里$ array是日志文件完整路径的保存位置,它作为传递变量的工作方式非常好。 我尝试使用没有-v参数的awk,根本没有关系。

[编辑2]:这是打印“$ array”的结果。“\ n”;

/app/bea/user_projects/domains/granite/om_ni.log.2 

当我运行perl脚本,我得到的结果是:

INFO - 28B26AD1-E959-4F5F-BD89-A7A6E601BE18INFO - ProcessNode terminated... [28B26AD1-E959-4F5F-BD89-A7A6E601BE18] syntax error The source line is 1. 
The error context is 
INFO - 28B26AD1-E959-4F5F-BD89-A7A6E601BE18,INFO - ProcessNode >>> terminated. <<< .. [28B26AD1-E959-4F5F-BD89-A7A6E601BE18] 
awk: Quitting 
The source line is 1. 

错误在“终止”二字指向莫名其妙,但即使我使用转义字符遍及字符串,它只是没有按不在乎并返回相同的错误。

在这个问题上的任何帮助是高度赞赏。提前感谢了很多。

+0

很高兴看到完整的代码。 'capture'之前执行'$ ssh-> login'吗? – 2013-04-26 09:16:17

+0

我们看不到你的整个命令,因为你没有向我们展示'$ array'是什么。建议:在你的脚本中加入'print'awk -v i = $ array'$ a,$ b'i“',看看你试图运行的命令是什么样的。这可能会使错误变得明显。但是,如果没有,请更新问题以包含您正在运行的确切命令(打印语句的输出)。 – 2013-04-26 09:38:55

+0

@DmitryMina,这是一个Awk错误,所以看起来SSH连接正在工作。 – 2013-04-26 10:48:51

回答

0

尽管我并不真正知道awk,但您调用它的方式似乎并不正确。 Here is the manual for awk on HP-UX

单引号部分($a,$b)应该是程序。但是,您传递了两个文本字符串,甚至没有引用它们来分隔它们。这不是一个有效的awk程序;因此语法错误。

我想你想要的就像'/$a/, /$b/'这个程序(但是我又不是awk专家)。

此外,您将文件名设置为变量i,然后在调用该命令时使用i代替文件名。我不知道你为什么这样做,我认为它甚至不会在文件名中使用变量。只需使用$array(为了清晰起见,您应该将其重命名为$file之类的内容)。

所以你的整个命令应该是这个样子:

"awk '/$a/,/$b/' $file" 

在这种单一的命令,你正在处理三种不同的工具:Perl中,SSH和awk。这是很难调试的,因为如果出现问题,很难说出问题出在哪里。为了得到像这样的工作,你必须将任务分解成更小的部分。

在这种情况下,这意味着您应该手动SSH到服务器并使用awk进行游戏,直到获得正确的命令。只有当你确信你有awk命令的时候才应该尝试将它合并到Perl中。如果你以这种方式分解任务将会容易得多。

+0

喜丹, 感谢请花一点时间和帮助我 不幸的是,使用这个同义词是我尝试过的第一件事,它根本就没有关系。它是一个正则表达式视角,awk在HP-UX环境中看起来不太合适 我试过用awk使用bash脚本的几种不同的东西,它只是不能真正起作用 我可能会将我的代码改为单独使用Perl循环解析 无论如何非常感谢 – MertD 2013-04-29 09:07:03

+0

@MertD ,如果你想让awk工作,有人可能会帮助你,如果你写一个关于awk命令的问题。 – 2013-04-29 09:12:16

相关问题