2

I'm new to bash and want to improve. I need to learn reading specific text from a file or from output of a command.For example I want to sum of the total ethernet interrupt numbers of each core of the computer from /proc/interrupts file.The content of the file is:

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

I need to read all of the numbers of interrupts with "eth" keyword and then find the sum of them for each CPU core(whateve the CPU core name is). For example for CPU0:33568+0+1+28217... What is suitable for this? Must I use awk or sed for regex and how?

4

2 に答える 2

3

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 ヘッダーのみが含まれている場合NFは、スクリプトの最初に示されているように使用できます。他のデータが存在する可能性がある場合core_count = gsub(/CPU/, "CPU")は、使用できます。また、このスクリプトは、連続する CPU 列に依存します。

于 2012-07-20T12:22:16.933 に答える
2

を使用して eth 行を除外し、awk を使用して合計grepできます。

たとえば、CPU 1 と 2 の場合:

grep eth report | awk '{ CPU0 += $2; CPU1 += $3} END { print CPU0; print CPU1} ' 

これに使用するのではなく、awk 内でフィルタリングできることに注意してくださいgrep

ただし、Perl でこれを実行して、CPU ごとの合計のハッシュを作成したくなるかもしれません。それは、私がこれをどの程度拡張可能にしたいかによって異なります。

于 2012-07-20T12:20:15.833 に答える