【发布时间】:2013-04-20 09:13:50
【问题描述】:
我在 HP-UX 服务器上不断更新大量日志文件。我创建了 Perl 代码来找出我正在使用的字符串所在的日志文件的名称。 Perl 使用 split 获取文件名并将其传递给变量。使用用户输入我将开始和停止字符串创建为两个变量。例如:
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";
[编辑]:正如你们所要求的,上面是 $array 如何被填充的开始。下面是 awk 序列的开始:
my $a= "INFO - $userinput1";print $a;
my $b= "INFO - ProcessNode terminated... [$userinput1]";print $b;
使用 awk 作为 ssh capture 命令的一部分,它将搜索整个日志文件并捕获字符串 $a 和字符串 $b 之间的每一行,然后将所有内容放入另一个数组中。例如:
my $output2=$ssh->capture("awk -v i=$array '$a,$b' i");
这里 $array 是保存日志文件完整路径的位置,它作为传递变量完全可以正常工作。 我也尝试使用不带 -v 参数的 awk,一点也不重要。
[EDIT 2]:这是 print "$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.
以某种方式指向“终止”字的错误,但即使我在整个字符串中使用转义字符,它也不在乎并返回相同的错误。
非常感谢您对此问题的任何帮助。非常感谢提前。
【问题讨论】:
-
很高兴看到完整的代码。你在
capture之前执行$ssh->login吗? -
我们看不到您的整个命令,因为您没有向我们展示
$array是什么。建议:将其添加到您的脚本print "awk -v i=$array '$a,$b' i"并查看您尝试运行的命令的确切外观。这可能会使错误变得明显。但如果不是,请更新问题以包含您正在运行的确切命令(打印语句的输出)。 -
@DmitryMina,这是一个 Awk 错误,所以看起来 SSH 连接正在工作。
-
@dan1111,不确定这是否是 awk 错误,“终止”似乎更像是在 SSH 连接范围内...
-
@dan1111 我发送的输出完全来自您建议的打印。“错误上下文是”部分之前的第一行是显示打印“$array”的位置。
标签: perl ssh awk split capture