我正在寻找一个能够解析unix shell命令输出的库,例如ipadm
,df
或zpool
。有人可以帮忙吗?
答案 0 :(得分: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......
正则表达式将固定宽度的字符串捕获到命名组(fs,块等)中,这允许代码通过Groups
属性访问它们。使用^
时,$
和RegexOptions.Multiline
匹配单行的开头和结尾。