regex - 读取命令的输出或从文件中读取

标签 regex linux bash shell

我是 bash 新手,想要改进。我需要学习从文件或命令的输出中读取特定文本。例如,我想从/proc/interrupts 文件中计算计算机每个核心的以太网中断总数。该文件的内容是:

CPU0       CPU1       CPU2       CPU3
0:        142          0          0          0   IO-APIC-edge      timer
1:          1          0          1          0   IO-APIC-edge      i8042
4:        694         18        635         19   IO-APIC-edge      serial
7:          0          0          0          0   IO-APIC-edge      parport0
9:          0          0          0          0   IO-APIC-fasteoi   acpi
12:          1          1          0          2   IO-APIC-edge      i8042
14:          0          0          0          0   IO-APIC-edge      ide0
19:          0          0          0          0   IO-APIC-fasteoi   uhci_hcd:usb3
23:          0          0          0          0   IO-APIC-fasteoi   ehci_hcd:usb1,  uhci_hcd:usb2
46:     347470     119806     340499     108227   PCI-MSI-edge      ahci
47:      33568      45958      46028      49191   PCI-MSI-edge      eth0-rx-0
48:          0          0          0          0   PCI-MSI-edge      eth0-tx-0
49:          1          0          1          0   PCI-MSI-edge      eth0
50:      28217      42237      65203      39086   PCI-MSI-edge      eth1-rx-0
51:          0          0          0          0   PCI-MSI-edge      eth1-tx-0
52:          0          1          0          1   PCI-MSI-edge      eth1
59:     114991     338765      77952     134850   PCI-MSI-edge      eth4-rx-0
60:     429029     315813     710091      26714   PCI-MSI-edge      eth4-tx-0
61:          5          2          1          5   PCI-MSI-edge      eth4
62:    1647083     208840    1164288     933967   PCI-MSI-edge      eth5-rx-0
63:     673787    1542662     195326    1329903   PCI-MSI-edge      eth5-tx-0
64:          5          6          7          4   PCI-MSI-edge      eth5

我需要读取带有“eth”关键字的所有中断数量,然后找到每个 CPU 核心(无论 CPU 核心名称是什么)的总和。例如对于CPU0:33568+0+1+28217... 什么适合这个?我是否必须使用 awk 或 sed 来执行正则表达式以及如何使用?

最佳答案

您可以使用 awk 来实现此目的,不需要 grep 或任何其他工具,因为 awk 可以自行执行搜索。

更新:

基于不同数量的 CPU 列的可能性(请参阅下面的第一条评论),这将起作用:

NR==1 {
  core_count = NF
  print "core count: ", core_count
  next
}
/eth/ {
  for (i = 2; i <= 2+core_count; i++)
    totals[i-2] += $i
}

END {
  print "Totals"
  for (i = 0; i < core_count; i++)
    printf("CPU%d: %d\n", i, totals[i])
}

给出输出:

core count:  4
Totals
CPU0:  2926686
CPU1:  2494284
CPU2:  2258897
CPU3:  2513721

注释:

如果第一行仅包含 CPU header ,则可以使用脚本开头所示的 NF 。如果可能存在其他数据,则可以使用 core_count = gsub(/CPU/, "CPU") 。此外,该脚本依赖于连续的 CPU 列。

关于regex - 读取命令的输出或从文件中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11579188/

相关文章:

php - Windows 共享主机上的 fpdf 权限

Linux 在特定部分中搜索和替换

regex - 如何从 Bash 中的正则表达式中提取多个环境变量?

bash - 如何通过管道输出到标准输出和变量?

java - 在 Java 中提取不区分大小写的子字符串的正则表达式

javascript - jQuery/Javascript 中的 DD/MM/YYYY 正则表达式等价物

c++ - Linux中加载时链接与运行时链接期间的符号地址

linux - 使 curl 命令 shell 脚本 centOS 超时

regex - 如何加入文件中的前n行

regex - Perl6 解析文件