【问题标题】:Find a specific word in a file在文件中查找特定单词
【发布时间】:2013-08-05 22:40:45
【问题描述】:

首先,我想在目录中搜索一个特定的文件,然后在该文件中我需要搜索一个特定的词。到目前为止,这是我所拥有的:

$show_bp = 'ShowBuildProcess';
$get_bs = 'GetBuildStatus';

opendir (DIR, $my_dir) or die $!;

while(my $file = readdir(DIR))
{
        if($file=~/\.log/)
        {
                if($file=~/GetBuildStatus/)
                {

文件名类似于GetStatus.<number>.log,例如GetStatus.123456.log。我需要:

  • 在目录中查找所有.log文件
  • 搜索文件名以GetStatus开头的文件
  • 搜索带有小数字部分的文件名
  • 在该文件中搜索特定单词

【问题讨论】:

  • 文件名将类似于“GetStatus.123456.log”和“GetStatus.3456781.log”我需要首先找到目录中的所有.log文件,然后搜索文件名以GetStatus开头的文件然后搜索具有较小值的文件名,即 123456 或 3456781,然后在该文件中搜索特定单词。
  • @ramki067 “具有较小的值,即 123456 或 3456781”是什么意思。请举一个简单的日志文件示例,您想从中获得什么?
  • @user4035 你说得对。我只看到opendir 和die...

标签: perl file search


【解决方案1】:

这里有一个可能的解决方案: 首先我们查看文件模式并提取$1,这是括号中的第一个正则表达式匹配)。如果文件适合我们打开它并逐行查看并寻找与您的/YourSearchPattern/匹配的:

#!/usr/bin/perl

use warnings;
use strict;

my $mydir = './test/';

opendir (DIR, $mydir) or die $!;

while(my $file = readdir(DIR)){
   if ($file =~ /^GetStatus\.(\d+)\.log$/){

      if ($1 >= 123456 || $1 < 345678){
           open(my $fh,'<', $mydir . $file) or die "Cannot open file $file: $!\n";
           while (<$fh>){
             if ($_ =~ /YourSearchPattern/){
                print $_;
            }
           }
           close($fh);
      }
   }
}

当您从目录中查找文件的最小序列号时,您可以简单地将它们存储在一个数组中,然后按照这些数字对它们进行排序:

...
opendir (DIR, $mydir) or die $!;

my @files;

while(my $file = readdir(DIR)){
   if ($file =~ /^GetStatus\.(\d+)\.log$/){
        push @files $file;
   }
}

my @sortedfiles = sort { my ($anum,$bnum); $a =~ /^GetStatus\.(\d+)\.log$/; $anum = $1; $b =~ /^GetStatus\.(\d+)\.log$/; $bnum = $1; $anum <=> $bnum } @files;

print $sortedfiles[0] . " has the smallest sequence number!\n";

【讨论】:

  • 您好,感谢您提供的解决方案,这几乎是我所需要的。但是,我提到的文件名只是一个例子。实际文件名将具有不同的连续数字。因此,我想找到序列号较小的文件。例如:2个文件名为“GetStatus.123456.log”和“GetStatus.123459.log”
  • 你的意思是你想在你的目录中找到最小的序号?
  • @ramki067 如果您满意,请随时关闭问题/点赞。
猜你喜欢
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多