2017-07-02 80 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()参数
  • 还删除了无关$在其他答案中提到。