我正在尝试解析
lspci -k
每个设备的输出。换句话说,使用以下示例输出:
00:00.0 Host bridge: Intel Corporation 4th Gen Core Processor DRAM Controller (rev 06)
Subsystem: Gigabyte Technology Co., Ltd Device 5000
00:02.0 VGA compatible controller: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller (rev 06)
Subsystem: Gigabyte Technology Co., Ltd Device d000
Kernel driver in use: i915
00:03.0 Audio device: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor HD Audio Controller (rev 06)
Subsystem: Gigabyte Technology Co., Ltd Device 5000
Kernel driver in use: snd_hda_intel
00:16.0 Communication controller: Intel Corporation 8 Series/C220 Series Chipset Family MEI Controller #1 (rev 04)
Subsystem: Gigabyte Technology Co., Ltd Device 5001
Kernel driver in use: mei_me
我希望能够遍历每个文件和相关信息。我用来检测??:??。?格式的正则表达式。其他地方是:
grep -E '^[0-9]\w:[0-9]\w\.[0-9]' <<< "$s" | awk -F ' ' '{print $1}'
$ s是此格式列表中有多少设备。我之所以使用它,是因为我列出的非PCI设备格式不同。
在这种情况下,我想我可以获取每个匹配项的行号,因此将上述语句传递到
grep -n
然后从一个区域到另一个区域使用sed cut,但是我觉得这不是解决此问题的有效方法。有什么建议?
我正在考虑的另一种解决方案是逐行读取并将空格转换为某些符号:例如
tr ' ' '%'
如果以该行开头,则将其包括在内。但是,这可能会很棘手,因为我需要在循环外部添加一个外部变量。当然,我也可以在每个正则表达式实例之后添加\ n,然后设置:
IFS=$'\n'
既然已将其选中,
tr $'\t' 'x'
效果很好。但是,我觉得最有效的方法仍然是以某种方式剪切整个部分然后grep我需要的信息,而不是逐行处理随机变量。
以下代码将每个条目lspci -k
分为几部分:
$ /sbin/lspci -k | awk -F'\t' 'NF == 1 { ++n; f = 0 } { a[n, ++f] = $NF }
END {
for (i = 1; i <= n; ++i) {
print "section", i; f = 0; while (a[i, ++f]) print a[i, f]; print ""
}
}'
通过将输入字段分隔符设置为制表符,我们可以通过它们具有多少个字段来识别哪些行是新节的开始。每个部分的开头只有1个字段。
END
块中的代码演示了一个事实,即可以a
使用两个索引段号和字段号在数组中访问每个字段。它只是遍历每一个,但是例如,您可以自定义逻辑以打印给定的字段(如果它与某种模式匹配)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句