我可以使用获取数据sudo lspci -vvv
,但随后我必须解析它,这有点棘手......
我可以 grep 所需的相关 PCIe 名称,然后-A
在名称后使用 N 行,但它并不健壮。我还可以将结果拆分,\n\n
然后处理它,grep 相关的 pcie 名称,但同样,感觉不好。
cut
或者tr
不适用于字符串 AFAIK,所以我无法使用分隔符进行处理\n\n
,所以我感觉有点卡住
答案1
最简单的方法是使用正则表达式,它可以匹配由命令的整个输出组成的字符串的多行lspci
。可能有一个命令可以执行此操作,但我不知道,因此通常您必须使用 Perl 或 Python 等语言来执行此操作。为简洁起见,这里是一个示例 perl 命令,用于仅提取NonFatalErr
我的音频芯片组的“Root Complex”功能的标志。
#!/usr/bin/env perl
use strict;
my $data = join('',<>);
if ( $data =~ m{
Audio\ device:
.*?Capabilities:[^\n]*Root\ Complex
.*?DevSta:
.*?(NonFatalErr.)
}sx ){
print "found DevSta: $1 !\n";
}
将其放入文件中myprog
,执行操作chmod +x myprog
,并将lspci
输出通过管道传输到其中。
正则表达式是一个很大的主题,这里无法解释,但值得学习,因为它们非常强大。
上面的 perl 将所有输入读取到单个字符串中$data
。然后一场比赛m{正则表达式}标志是用 perl 标志完成的,s
以制作“.”。匹配换行符,并标记x
为忽略正则表达式中的空格。
“Audio\ Device”与数据中的“Audio Device”匹配,并.*?
跳过最小数量的字符(“非贪婪”),直到正则表达式的其余部分匹配。找到了几个“功能:”之一,但我们继续,直到找到具有“根复合体”并且没有中间换行符的那个([^\n]*
)。有几个“NonFatalErr”字符串,但我们想要一个DevSta
.我们捕获字符串(使用()
)加上一个后续字符
(NonFatalErr.)
,该字符是标志的值(+
或-
)。我们打印 perl 保存在变量中的捕获$1
。
这是概念证明,而不是教程,因此请将其用作您自己的解决方案的动力。