awk脚本总是打印sum = 0

时间:2017-07-02 14:15:33

标签: linux bash awk scripting

如果这个问题可能很愚蠢,我很抱歉,但我对awk脚本完全不熟悉。 我想要做的是用户“root”计算和打印CPU和内存的使用情况。 我写了这个执行awk脚本的bash脚本:

#!/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/中的打印件是正确的。 有什么建议吗?

3 个答案:

答案 0 :(得分:4)

$不用于扩展awk中的变量,它指示特定输入字段的扩展,其数字包含在给定变量中。也就是说,如果cpu=3,则$cpu相当于$3。只需单独使用变量名称。

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

答案 1 :(得分:2)

最初的方法似乎是多余的。使用可以直接通过root选项提取用户名ps所需的字段:

整个工作:

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字段值

答案 2 :(得分: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()之后添加空格
  • 还删除了其他答案中提到的无关的$