2010-11-18 6 views
2

Ich habe ein C# -Konsolenprogramm, dessen Hauptfunktionen es einem Benutzer ermöglichen sollten, Zeilen/Spalten aus einer Protokolltextdatei zu grepsen.C# -Programmierung Wie grep Spalten/Zeilen aus Textdatei?

Ein Beispiel in der Textdatei der Benutzer möchte eine Gruppe aller verwandten Linien ab einem bestimmten Datum usw. grep "Di Aug 03 2004 22:58:34" bis "Mi Aug 04 2004 00:56: 48 ". Daher würde das Programm nach der Verarbeitung alle zwischen den 2 Daten liegenden Daten in den Log-Text-Dateien ausgeben.

Könnte jemand bitte auf einige Codes hinweisen, die ich verwenden könnte, um grep oder einen Filter zu erstellen, um die notwendigen Texte/Daten aus der Datei abzurufen? Vielen Dank!

C# Program Files:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 
using System.IO; 

namespace Testing 
{ 
class Analysis 
{ 
    static void Main() 
    { 
     // Read the file lines into a string array. 
     string[] lines = System.IO.File.ReadAllLines(@"C:\Test\ntfs.txt"); 

     System.Console.WriteLine("Analyzing ntfs.txt:"); 

     foreach (string line in lines) 
     { 
      Console.WriteLine("\t" + line); 

      // ***Trying to filter/grep out dates, file size, etc**** 
      if (lines = "Sun Nov 19 2000") 
      { 
       Console.WriteLine("Print entire line"); 
      } 
     } 

     // Keep the console window open in debug mode. 
     Console.WriteLine("Press any key to exit."); 
     System.Console.ReadKey(); 
    } 
} 
} 

Log Textdatei Beispiel:

Wed Jul 21 2004 16:58:48 499712 m... r/rrwxrwxrwx 0  0  8360-128-3 
C:/Program Files/AccessData/Common Files/AccessData LicenseManager/LicenseManager.exe 

Tue Aug 03 2004 22:58:34 23040 m... r/rrwxrwxrwx 0  0  8522-128-3 
C:/System Volume Information/_restore{88D7369F-4F7E-44D4-8CD1- 
F7FF1F6AC067}/RP4/A0002101.sys 

23040 m... r/rrwxrwxrwx 0  0  9132-128-3 
C:/WINDOWS/system32/ReinstallBackups/0003/DriverFiles/i386/mouclass.sys 

23040 m... r/rrwxrwxrwx 0  0  9135-128-4 C:/System Volume 
Information/_restore{88D7369F-4F7E-44D4-8CD1-F7FF1F6AC067}/RP4/A0003123.sys 

23040 m... r/rrwxrwxrwx 0  0  9136-128-3 
C:/WINDOWS/system32/drivers/mouclass.sys 

Tue Aug 03 2004 23:01:16 196864 m... r/rrwxrwxrwx 0  0  4706-128-3 
C:/WINDOWS/system32/drivers/rdpdr.sys 

Tue Aug 03 2004 23:08:18 24960 m... r/rrwxrwxrwx 0  0  8690-128-3 
C:/WINDOWS/system32/drivers/hidparse.sys 

Antwort

2

Nun, als eine schnelle Lösung für das spezifische Beispiel:

if (line.StartsWith("Sun Nov 19 2000")) 
{ 
    Console.WriteLine(line); 
} 

Sie Contains verwenden könnten einen Teil innerhalb der Linie zu finden.

Beachten Sie, dass das Laden der gesamten Datei in einem Array für sehr große Protokolle nicht gut skaliert werden kann. Wir können in Festsetzung aussehen, dass, wenn es ein Problem für Sie ist - aber wir langsam die Dinge nehmen :)

+0

Liest das "StartsWith" nur den Anfang? Weil es einige Zeilen gibt, die nicht mit einem Datum als Formular mit mehreren Prozessen beginnen, die gleichzeitig stattfinden. Vielen Dank. – JavaNoob

+0

@JavaNoob: Ja, "StartsWith" prüft nur den Anfang der Zeile - deshalb habe ich auch "Contains" erwähnt ... obwohl es sich anhört, dass Ihre verschiedenen Prozesse möglicherweise Ihre Log-Dateien korrumpieren, was sich zu reparieren lohnt als separate Angelegenheit. –

+0

Die mehreren Prozesse werden korrekt verwendet, da die Protokolle als Verwendung für MACtimes gedacht sind. Ich habe die Log-Abschnitte in meiner Frage oben bearbeitet, also sehen Sie sich das bitte an. Vielen Dank. – JavaNoob

4

du Regex mit tun könnte passender Linien in einer reicheren Weise zu wählen als string.Contains ermöglicht.

Nicht sicher, warum Sie neu erfinden findstr.exe obwohl.

Für große Dateien finden Sie vielleicht File.ReadLines (.Net 4 nur) eine bessere Leistung - dies liest die gleichen Linien, sondern ermöglicht es Ihnen, sie in einem foreach und andere IEnumerable Szenarien zu verarbeiten, ohne sofort die gesamte Datei in den Arbeitsspeicher geladen werden.

+0

Reps up für die Readlines Idee! Vielen Dank! – JavaNoob

1

hier ein grep Stil Methode, die ich in Tests verwenden:

public static List<string> FileGrep(string filePath, string searchText) 
    { 
     var matches = new List<string>(); 

     using (var f = File.OpenRead(filePath)) 
     { 
      var s = new StreamReader(f); 

      while (!s.EndOfStream) 
      { 
       var line = s.ReadLine(); 

       if (line != null && line.Contains(searchText)) matches.Add(line); 
      } 

      f.Close(); 
     } 

     return matches; 
    }