2017-07-02 78 views
3

如果問題可能很愚蠢,我很抱歉,但我對awk腳本完全陌生。 我想要做的是由用戶「root」來計算和打印CPU和內存的使用情況。 我寫了這個bash腳本,其執行awk腳本:awk腳本總是打印sum = 0

#!/bin/bash 

ps aux > processi.txt 
echo Lancio script3.awk 
awk -f script3.awk processi.txt 

和awk腳本如下:

#!/usr/bin/awk 

BEGIN{ 
print "Inizio script\n" 
cpu=0 
mem=0 
} 

/root/{ 
    printf("Cpu usata da root loop=%.1f, memoria=%.1f\n",$3,$4) 

     cpu=cpu+$3 
     mem=mem+$4 
} 

END{ 
printf("Cpu usata da root=%.1f, memoria=%.1f\n",$cpu,$mem) 
print "\nFine script\n" 
} 

但是從END打印爲0,而在/root/是正確的。 有什麼建議嗎?

回答

4

$未用於展開awk中的變量,其中它表示其數字包含在給定變量中的特定輸入字段的擴展。也就是說,如果cpu=3,則$cpu等於$3。只需使用變量名稱就可以了。

END { 
    printf("Cpu usata da root=%.1f, memoria=%.1f\n", cpu, mem) 
    print "\nFine script\n" 
} 
+0

謝謝,我不知道。這解決了這個問題。 – rafc

+1

@rafc永遠記得 - ** awk不是shell **。 Awk的語法與C相比更像是shell。 –

+1

@EdMorton好吧,從語法上來說這是合法的,儘管可能在'END'塊中幾乎沒用。但一致認爲,對於預期用途它不能使用。 – chepner

2

最初的方法似乎是多餘的。使用可直接由ps選項中提取用戶名root所需字段:

整個工作:

ps U root -eo %cpu,%mem --no-header | awk 'BEGIN{ print "Inizio script\n" } 
    { printf("Cpu usata da root loop=%.1f, memoria=%.1f\n",$1,$2); cpu+=$1; mem+=$2; } 
    END { printf("Cpu usata da root=%.1f, memoria=%.1f\n\nFine script\n", cpu, mem) }' 

  • U root - 只有用戶名root

  • 選擇數據
  • -eo %cpu,%mem - 僅輸出cpumem字段值

1

雖然這並不解決您的問題本身,將不適合在評論是一個額外的建議:格式化你的代碼始終會讓你的代碼更易於閱讀和調試

像這樣:

#!/usr/bin/awk 

BEGIN { 
    print "Inizio script\n" 
    cpu = 0 
    mem = 0 
} 

/root/ { 
    printf("Cpu usata da root loop=%.1f, memoria=%.1f\n", $3, $4) 

    cpu = cpu + $3 
    mem = mem + $4 
} 

END { 
    printf("Cpu usata da root=%.1f, memoria=%.1f\n", cpu, mem) 
    print "\nFine script\n" 
} 

,我

    {}
  • 縮進任何同級別
  • 的運營商放空間,如=和塊標籤之間+
  • 放空間並開放{
  • ,之後放置空格printf()參數
  • 還刪除了無關$在其他答案中提到。