我正在构建一个程序,每48小时轮询一次网络设备,并记录输出用户Perl和Expect模块。目前,我将输出文本保存到文本文件,然后过滤文本文件以获取所需信息。最初,这很好,因为在处理大小只有百KB的文件并保留大部分文本时,效率并不是一个大问题,但我发现了一个新命令,我想在远程执行网络设备。此命令需要一个半小时才能运行,创建一个大小约为5MB的文本文件,我可能只保留10KB的信息。使用基本文件I / O(读取文本文件,写入文本文件)似乎是一个坏主意,我一直认为必须有更好的方法。
到目前为止,我的研究结果如何: 我应该使用某种管道。就像是:
open($filehandle, "myCommand");
还有其他解决方案,但它们似乎暗示我将ENTIRE文件保存到一个变量,当我想在写入文件之前只保存和修改它的一部分。
TIEHANDLE适用于覆盖“打印”,但我不认为这是必要的或将在这里工作。
到目前为止我尝试过的事情: 使用管道重定向STDOUT。结果:保持将输出发送到文件,并且在将文本放入文件之前无法编辑该文本。
我已经用尽了谷歌。如果一个完整的解决方案太令人生畏的任务,那么关于下一步可能在哪里的提示也将非常感激。
另外,如果处理时间方面的优势实际上很小(我不清楚处理5mb测试文件需要多长时间并且会进行调查),请告诉我。
答案 0 :(得分:0)
根据你的perl版本,你可以这样做:
open(my $fh, "-|", command => @command_arguments) or die "Error: $!";
while (<$fh>) {
# Process output of command
}
close $fh or die "Error: $!";
在旧版本(我认为5.6或更早版本)上,你可以这样做:
my $pid = open(my $fh, "-|");
die "Failed to fork: $!" unless defined $pid;
unless ($pid) {
exec command => @command_arguments;
die "Failed to exec command: $!";
}
while (<$fh>) {
# same thing etc.
如果你真的需要Expect,我无法从你的帖子中得知。如果你只需要执行命令并捕获输出,那么上面应该没问题。
答案 1 :(得分:0)
Perl可以立即处理5MB文件,当你可以打开文件并在作业完成后解析它时,我不会担心尝试将输出重定向到管道。
open(INPUT, "/path/to/file.log") or die "Can't open file: $!";
while (<INPUT>) {
chomp;
if (/ERROR/) {
print "Found an error!";
}
}
close(INPUT);
exit;
当您在while()循环中时,您可以使用正则表达式,拆分或任何您想要在文件中查找所需内容的内容。当前行存储在$ _中。您将为输入文件的每一行获得一次迭代。
希望这会有所帮助......