【问题标题】:awk script always prints sum=0awk 脚本总是打印 sum=0
【发布时间】:2017-12-05 21:44:27
【问题描述】:

如果这个问题可能很愚蠢,我很抱歉,但我对 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/ 是正确的。 有什么建议吗?

【问题讨论】:

    标签: linux bash awk scripting


    【解决方案1】:

    $ 不用于扩展 awk 中的变量,它表示扩展特定输入字段,其编号包含在给定变量中。也就是说,如果cpu=3,那么$cpu 等价于$3。只需使用变量名即可。

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

    【讨论】:

    • @rafc 永远记住 - awk 不是 shell。与 shell 相比,awk 语法与 C 更相似。
    • @EdMorton 好吧,在语法上它是合法的,尽管在 END 块中可能几乎没用。但同意,不能用于预期用途。
    • 只是添加一些信息:在 END 块内,与字段编号相关的行为未由 POSIX 定义。因此,当cpu=3 然后$cpu = $3 如您所说但在每个awk 的基础上,END 部分中$3 的值可能是最后读取的记录的第三个字段的值,或者它可能是NULL 字符串或者它可以是其他任何东西。 POSIX 在 END 部分中唯一要求与读取的最后一条记录相关的值是 NF 是读取的最后一条记录中的字段数,但由每个 awk 决定 $0、$1 等应该包含的内容和有些人选择NULL。
    • 谢谢;我没有费心去查找它,只是假设它会保留最后一个值。
    【解决方案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 字段值

    【讨论】:

      【解决方案3】:

      虽然这本身并不能解决您的问题,但另一个不适合评论的建议是:一致地格式化您的代码将使您的代码更易于阅读和调试。。 p>

      像这样:

      #!/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() 参数中的 ,s 之后放置空格
      • 还删除了另一个答案中提到的无关$

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-04
        • 1970-01-01
        • 2015-05-28
        • 1970-01-01
        相关资源
        最近更新 更多