PCIe機能+状態を抽出する最も簡単な方法は何ですか?

PCIe機能+状態を抽出する最も簡単な方法は何ですか?

データを使用できますが、sudo lspci -vvv解析する必要がありますが少し面倒です。

必要な関連PCIe名を見つけて、-A名前の後にN行を使用できますが、強力ではありません。結果を分割して\n\n処理し、関連するpcie名をgrepすることもできますが、やはり気分が悪くなります。

cutあるいは、trAFAIK文字列と一緒に機能しないため、区切り文字として使用できないため、\n\n少し閉じ込められた感じがします。

ベストアンサー1

最も簡単な方法は、コマンドの出力全体で構成される文字列の複数行に一致する正規表現を使用することですlspci。これを行うコマンドがあるかもしれませんが、私は知らないので、通常これを行うにはPerlやPythonなどの言語を使用する必要があります。簡潔にするために、NonFatalErr オーディオチップセットの「ルートコンプレックス」機能のフラグのみを抽出するサンプルPerlコマンドがあります。

#!/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{正規表現}フラグsこれは「.」を作成するためにperlフラグを使用して行われます。x正規表現でスペースを無視するには、改行とフラグを一致させます。

「Audio\Device」は、データの「Audio Device」と一致し、.*?残りの正規表現が一致するまで、最小文字数(「non-greedy」)をスキップします。いくつかの「関数:」の1つが見つかりましたが、「ルートコンプレックス」があり、途中に改行文字([^\n]*)がない関数を見つけるまで続けます。 "NonFatalErr"文字列は複数ありますが、私たちは1つが欲しいですDevSta。文字列とフラグ(または)の値である次の()文字をキャプチャします。 Perlによって変数に保存されているキャプチャを印刷します。(NonFatalErr.)+-$1

これはチュートリアルではなく概念証明なので、独自のソリューションの動機として活用してください。

おすすめ記事