데이터를 사용할 수 있지만 sudo lspci -vvv
파싱해야 하는데 조금 까다롭습니다...
필요한 관련 PCIe 이름을 찾아 -A
이름 뒤에 N 줄을 사용할 수 있지만 강력하지는 않습니다. 결과를 분할한 \n\n
다음 처리하고 관련 pcie 이름을 grep할 수도 있지만 다시 말하지만 기분이 좋지 않습니다.
cut
또는 tr
AFAIK 문자열과 함께 작동하지 않으므로 구분 기호로 사용할 수 없으므로 \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")를 건너뜁니다. 여러 "함수:" 중 하나가 발견되었지만 "루트 콤플렉스"가 있고 중간에 개행 문자( [^\n]*
)가 없는 함수를 찾을 때까지 계속합니다. "NonFatalErr" 문자열이 여러 개 있지만 우리는 하나를 원합니다 DevSta
. 문자열 과 플래그( 또는 ) 의 값인 ()
다음 문자를 캡처합니다. Perl에 의해 변수에 저장된 캡처를 인쇄합니다 .(NonFatalErr.)
+
-
$1
이는 튜토리얼이 아닌 개념 증명이므로 자신만의 솔루션을 위한 동기로 활용하시기 바랍니다.