2016-10-04 59 views
0

我在找一个能够解析unix shell命令输出的库,如ipadm,dfzpool。有人可以帮忙吗?寻找.NET解析器的shell输出

+0

听起来像你需要编写自己的文本解析器。没有适用于所有shell命令的库。 – jdweng

+0

许多shell命令以固定宽度命令返回结果。你不需要特殊的解析器。您可以使用字符串操作命令来分隔空间或读取固定长度的字符串,就像在Linux中一样。你也可以使用正则表达式来解析每一行 –

回答

0

许多shell命令以固定宽度格式返回结果。这不需要任何特殊的解析,简单的字符串拆分或正则表达式就足够了。例如,下面的正则表达式可以匹配的df输出:

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

可以与[Regex.Matches使用此(https://msdn.microsoft.com/en-us/library/system.text。 regularexpressions.regex.matches(v = vs.110)的.aspx)来解析每一行,并提取每个列的命名组:

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()); 
} 

甚至

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...... 

正则表达式捕获定点宽度严格gs转换为命名组(fs,blocks等),允许代码通过Groups属性访问它们。当使用RegexOptions.Multiline时,^$匹配单行的开始和结束。