2015-12-14 104 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