我设计了一个程序,遍历我所有应用程序中不同Solaris(Unix)框中的每个日志文件,并查找某个错误。所以,我设计了这样的程序:
my $ssh2 = Net::SSH2->new();
$ssh2->connect($host) or die "Unable to connect Host $@ \n";
$ssh2->auth_keyboard($user,$pass) or die "Unable to login $@ \n";
$chan1 = $ssh2->channel();
$chan1->exec("find /apps/appName/loc/Logs/server/ -type f | xargs grep \"CVS Call\" ");
while(<$chan1>) {
print $_ . "\n";
}
如果我要用一个词(只是&#39; CVS&#39;),它就可以了。但是,第二个我添加一个空格或一个点,它没有找到任何东西。我尝试用[[:space:]]或[:space:]替换空格,但它仍然没有显示任何结果。我知道日志文件包含此错误的事实。
我也尝试过:
$chan1->exec("find /apps/appName/loc/Logs/server/ -type f -exec grep 'CVS Call' '{}' \\; -print");
我使用此命令获得相同的结果,只使用一个单词找到工作,只要我添加第二个单词,它就不会显示任何结果。
有没有人知道为什么当我在grep搜索中添加一个空格时它找不到任何东西。
答案 0 :(得分:1)
问题可能与所需的几个引用级别有关。手动操作非常困难。
如果你在Linux / Unix机器上,可以使用Net::OpenSSH为你做引用:
my $ssh = Net::OpenSSH->new($host, user => $user, password => $password);
my @lines = $ssh->capture('find', $logs_dir,
'-type', 'f',
'-exec', 'grep', '-q', $string, '{}', ';',
'-print');
for (@lines) {
...
}