2015-12-14 78 views
0

下面的示例代碼來自pci.ids。我想使用lspci中的類代碼(可以說它是0580),並將它導航到C 05> 80:內存控制器。我覺得最合適的方法(避免從錯誤的類中返回值)是先切割C 05的部分,然後再查找80. Grep -A ...將在返回之後返回所有內容,因此如果80在C05中不匹配,它會跳到某個包含80個元素的Cn。通過製表符縮進部分的結尾輸出匹配的字符串?

C 03 Display controller 
    00 VGA compatible controller 
     00 VGA controller 
     01 8514 controller 
    01 XGA compatible controller 
    02 3D controller 
    80 Display controller 
C 04 Multimedia controller 
    00 Multimedia video controller 
    01 Multimedia audio controller 
    02 Computer telephony device 
    03 Audio device 
    80 Multimedia controller 
C 05 Memory controller 
    00 RAM memory 
    01 FLASH memory 
    80 Memory controller 
C 06 Bridge 
    00 Host bridge 
    01 ISA bridge 
    02 EISA bridge 
    03 MicroChannel bridge 
    04 PCI bridge 
     00 Normal decode 
     01 Subtractive decode 
    05 PCMCIA bridge 
+0

我想我可以遍歷每個元素,並停止在'C'的實例,但這應該是一個更合適的方法。 – ksm18

回答

2

要通過 「0580」 到awk程序:

awk -v value='0580' ' 
    BEGIN {a = substr(value,1,2); b = substr(value,3,2)} 
    $1 == "C" { p = ($2 == a)} 
    p && $1 == b {print; exit} 
' file 

如果第一個字是 「C」 中,設置一個布爾爲true,如果第二個字是 「05」。
如果標誌爲真,並且第一個單詞是「80」,則打印當前行並退出。

+0

這在假設指定的類將包含代碼(在這種情況下,類5將包括元素80)的情況下工作良好。但是,我試圖找到一種方法來讓它在不存在的情況下中斷。例如,如果您的代碼在類5中沒有「80」,則會找到「80」的下一個實例。我需要它代替它。 – ksm18

+0

更新應該解決這個問題。如果「c05」中沒有「80」,則不會打印。它將貫穿整個文件。 –

+0

這有幫助,謝謝!在類似的說明中,你將如何去做以下事情:假設代替C 05,它只是05.因此,每個類的第一個非縮進行只是一些隨機數,可能或可能不是=一定數量的一個子元素。如果不假設非縮進行的名稱,你將如何去查看節標題(在這個類C 01,C 02等)?僞代碼的邏輯是:if(!startsWithWhitespace);打印。如果你想參考,我使用了一個pci.ids文件,它有很多我不需要的隨機東西。我現在的任務是搜索供應商ID#並返回供應商。 – ksm18