提取 PCIe 功能 + 状态的最简单方法是什么?

提取 PCIe 功能 + 状态的最简单方法是什么?

我可以使用获取数据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

这是概念证明,而不是教程,因此请将其用作您自己的解决方案的动力。

相关内容