awk脚本总是打印出sum=0

3

很抱歉,如果问题有点傻,请见谅,因为我对awk脚本完全不了解。 我的目的是计算和打印用户“root”的CPU和内存使用情况。 我编写了这个Bash脚本来执行一个awk脚本:

#!/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个回答

4
< p > 在 < code > awk 中,< code > $ 不用于扩展变量,其中它表示扩展给定变量中包含的特定输入字段的扩展。也就是说,如果 < code > cpu=3 ,那么 < code > $cpu 等同于 < code > $3 。只需单独使用变量名即可。 < /p >
END {
  printf("Cpu usata da root=%.1f, memoria=%.1f\n", cpu, mem)
  print "\nFine script\n"
}

1
@rafc永远要记住 - awk不是shell。Awk语法与C更相似,而不是shell。 - Ed Morton
1
@EdMorton 嗯,从语法上讲是合法的,尽管在 END 块内几乎没有用处。但同意,对于预期的用途它不能被使用。 - chepner
2
仅添加一些信息:在 END 块内,与字段编号相关的行为未被 POSIX 定义。因此,当 cpu=3 时,如您所述 $cpu = $3,但在每个 awk 中,END 部分中 $3 的值可能是最后读取记录的第三个字段的值,也可能是 NULL 字符串或其他任何值。 POSIX 在关于最后读取的记录的值方面规定的唯一事情是 NF 应该是该记录中字段的数量,但每个 awk 决定 $0、$1 等应包含什么,有些选择 NULL。 - Ed Morton
1
谢谢;我没有费心去查,只是假设它会保留最后一个值。 - 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()参数中的,后面加上空格
  • 还要删除其他答案中提到的多余的$

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接