我正在尝试解析
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 从一个区域剪切到下一个区域,但我觉得这不是解决此问题的有效方法。有什么建议么?
我正在考虑的另一个解决方案是逐行读取并将空格转换为某个符号:例如
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
block 中的代码演示了这样一个事实:可以使用两个索引 节号 和 节号 来访问数组 a
中的每个字段字段编号。它只是循环遍历每个字段,但您可以自定义逻辑以打印给定字段(例如,如果它与模式匹配)。
关于regex - 在正则表达式匹配之间剪切输出的最有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34342121/