2016-10-04 1 views
0

Ich bin auf der Suche nach einer Bibliothek, die Ausgabe von Unix-Shell-Befehle wie ipadm, oder zpool analysieren kann. Kann jemand aushelfen?Suche nach .NET-Parser Shell-Ausgabe

+0

Sound wie Sie müssen Ihren eigenen Textparser schreiben. Es gibt keine Bibliothek, die für alle Shell-Befehle funktioniert. – jdweng

+0

Viele Shell-Befehle geben Ergebnisse in einem Befehl mit fester Breite zurück. Sie brauchen dafür keinen speziellen Parser. Sie können Stringmanipulationsbefehle verwenden, um entweder nach Speicherplatz zu splitten oder Strings mit einer festen Länge zu lesen, genau wie in Linux. Sie können auch eine Regex verwenden, um jede Zeile zu analysieren –

Antwort

0

Viele Shell-Befehle geben Ergebnisse in einem Format mit fester Breite zurück. Dies erfordert kein spezielles Parsing, eine einfache String-Aufteilung oder ein regulärer Ausdruck ist ausreichend. Zum Beispiel kann der folgende reguläre Ausdruck die Ausgabe von df entsprechen:

^(?<fs>.{14})\s(?<blocks>.{9})\s(?<used>.{9})\s(?<available>.{9})\s(?<use>.{4})\s(?<on>.+)$ 

Hiermit können Sie mit [Regex.Matches (https://msdn.microsoft.com/en-us/library/system.text. regularexpressions.regex.matches (v = vs.110) ASPX-), um jede Zeile zu analysieren und jede Spalte als eine benannte Gruppe extrahieren:

var pattern = @"^(?<fs>.{14})\s(?<blocks>.{9})\s(?<used>.{9})\s(?<available>.{9})\s(?<use>.{4})\s(?<on>.+)$"; 
var regex=new Regex(pattern,RegexOptions.Multiline); 

var matches=regex.Matches(screenOutput); 
foreach (Match line in matches) 
{ 
    Console.WriteLine("{0} {1}",line.Groups["fs"].Trim(), line.Groups["used"].Trim()); 
} 

oder sogar

var results = from Match line in regex.Matches(screenOutput) 
       let groups=line.Groups 
       select new { 
          FS=groups["fs"].Value.Trim(), 
          Used=groups["used"].Value.Trim() 
         } 

var actualValues=results.Skip(1); // Skip the header 
foreach...... 

Der reguläre Ausdruck einfängt fest Breite gs in benannte Gruppen (fs, Blöcke usw.), die dem Code Zugriff auf sie über die Groups-Eigenschaft ermöglicht. ^ und $ passen den Anfang und das Ende einer einzelnen Zeile an, wenn RegexOptions.Multiline verwendet wird.