在Java中遍历一个日志文件。拉文件扫描

问题描述:

我目前有一个日志文件(见下文),我需要迭代并提取已扫描文件的列表。然后通过使用该文件列表将扫描的文件复制到不同的目录中。在Java中遍历一个日志文件。拉文件扫描

所以在这种情况下,它会经过拉 C:\工具\ baregrep.exe C:\工具\ baretail.exe 等等等等

,然后将它们移动到文件夹,例如c :\文件夹\ SafeFolder具有相同的文件结构

我希望我能有什么样的输出是一个失败的扫描样本,但是这将让我一个很好的开端,我大概可以算出其余出

Symantec Image of Log File

非常感谢您的帮助,我非常感谢您借给我的帮助。

这应该可以做到。现在,适应您的解决方案!

public static void find(String logPath, String safeFolder) throws FileNotFoundException, IOException { 
    ArrayList<File> files = new ArrayList<File>(); 

    BufferedReader br = new BufferedReader(new FileReader(logPath)); 
    StringBuilder sb = new StringBuilder(); 
    String line = null; 
    while ((line = br.readLine()) != null) { 
     Pattern pattern = Pattern.compile("'[a-zA-Z]:\\\\.+?'"); 
     Matcher matcher = pattern.matcher(line); 
     if (matcher.matches()) { 
     } 
     if (matcher.find()) { 
      files.add(new File(matcher.group())); 
      System.out.println("Got a new file! " + files.get(files.size() - 1)); 
     } 
    } 

    for (File f : files) { 
     // Make sure we get a file indeed 
     if (f.exists()) { 
      if (!f.renameTo(new File(safeFolder, f.getName()))) { 
       System.err.println("Unable to move file! " + f); 
      } 
     } else { 
      System.out.println("I got a wrong file! " + f); 
     } 
    } 
} 
+0

这看起来像会起作用。但是,我会在哪里放置从“处理文件”之后和下一个“之前”拉出的位置。“只是得到文件路径输出 – Heuristic 2012-01-05 16:30:00

+0

任何人有任何输入? 再次感谢您的帮助。 – Heuristic 2012-01-06 16:28:31

+0

我不明白你的问题,你可以再试一次并解释一下吗? – SHiRKiT 2012-01-07 17:32:48

它很简单。

  1. 使用NEW_LINE作为分隔符逐行读取日志文件。如果这是一个小文件,随时通过String.split加载它&处理它(“\ n”)或StringTokenizer的

  2. 当你循环每一行,你需要做一个简单的测试,如果该字符串检测包含“处理文件”。

  3. 如果是这样,使用正则表达式(更难)或简单的解析来捕获文件名。它应该在[']之内,因此检测[']的第一次出现,然后检测第二次,并获取中间的字符串。

  4. 如果您的字符串是有效的(您可以使用java.io.File进行测试)或现有的,则可以将文件名复制到另一个文件。我不会建议你不要在java中复制它以满足初学者的内存限制。

  5. 相反,复制文件的字符串,形成一个批处理文件来同时使用OS脚本如Windows BAT或bash脚本,例如CP'filename_from“copy_to_dir”

让我将它们复制知道你需要

问候

+0

一个可行的例子如果不是太痛苦的话会很好。 – Heuristic 2012-01-04 22:07:47

工作示例这个问题被标记为Java和像我爱的Java,这个问题是什么,会更容易和更快地解决语言如Perl(所以如果你只想要最终结果和d o不需要在特定的环境中运行,那么您可能希望使用脚本语言)。

不是一个可行的实现,但是下面的代码是perl需要的所有代码:(语法未经测试,可能按照原样被破坏,只是作为指南..自从我编写任何perl以来已经有一段时间了)。

use File::Copy; 
my $outdir = "c:/out/"; 
while(<>) 
{ 
    my ($path) = /Processing File\s+\'([^\']+)\'/; 
    my ($file) = $path =~ /(.*\\)+([^\\]+)/; 
    if (($file) && (-e $path)) 
    { 
    copy($path,$outdir . $file); 
    } 
} 
+0

请注意他在第5行和第6行发生了什么。您可以使用RegEx直接在Java中执行此操作。他一行一行地阅读,并使用正则表达式分组来提取他传递的复制的特定文件名。不想在Java中这样做,你可能会害怕Perl(我这样做)......给groovy一个镜头。 – 2012-01-04 23:06:18