regex - 在正则表达式匹配之间剪切输出的最有效方法?

标签 regex linux bash sed

我正在尝试解析

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/

相关文章:

c++ - 为什么我在linux下不能正常使用qt编程

bash - 如何使用 PDFTK(或其他命令行应用程序)查找和替换现有 PDF 文件中的文本

linux - 显示具有特定扩展名的所有文件的文件名

python - 如何在正则表达式模式中查找正则表达式模式

regex - 在KRL中如何制定这个select语句?

linux - 使用 awk 分割数据但缺少列名

BASH:用于替换文件树中文本的递归程序

python - 如果有正向前瞻和正向后向但没有定界符,我该如何拆分字符串?

regex - 如何从 HTML 文件中提取标签的属性值?

linux - 如何在不创建新文件的情况下合并大量文件