2012-07-20 146 views
2

我是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爲正則表達式,以及如何?

回答

3

您可以使用awk這個,有沒有需要grep或任何其他工具,因爲awk可以自己做搜索。

UPDATE

基於不同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列。

+0

這是一個很好的答案,但是CPU0是靜態的。如果我不知道CPU內核的名稱和數量,例如,如果它以cPU1開始並且通過CPU9。我必須先閱讀核心名稱並分配給此腳本的變量,或者是否有方法閱讀此腳本 – barp 2012-07-20 12:29:50

+0

@barp請嘗試此操作,最好使用不同數量的CPU列,並讓我知道這是否適用於您。我在這裏使用數組,只是fyi。另外請注意,我打印出腳本第三行中發現的內核數量,如果不需要,可以刪除它(認爲它可能對調試有幫助)。 – Levon 2012-07-20 12:41:00

+0

從報告的結構來看,NR將足以檢測我猜測的CPU數量。 – nshy 2012-07-20 12:46:50

2

您可以使用grep,然後sum using awk過濾出eth行。

例如對於CPU 1和2:

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

注意,您可以filter within awk,而不是使用grep這一點。

但是,我可能會試圖在Perl中做到這一點,並創建每個CPU的總和哈希值。這取決於我想如何擴展。

+0

這是一個很好的答案,但CPU0是靜態的。如果我不知道CPU內核的名稱和數量。例如,如果它以cPU1開頭並通過CPU9。必須先讀取核心名稱並分配給變量對於這個腳本,或者有一種方法可以在這個腳本中讀取 – barp 2012-07-20 12:29:25