首页 > 试题广场 >

统计所有进程占用内存百分比的和

[编程题]统计所有进程占用内存百分比的和
  • 热度指数:55537 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
假设 nowcoder.txt 内容如下:
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.4  77744  8332 ?        Ss    2021   1:15 /sbin/init noibrs splash
root         2  0.0  0.0      0     0 ?        S     2021   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        I<    2021   0:00 [kworker/0:0H]
daemon     486  0.0  0.1  28340  2372 ?        Ss    2021   0:00 /usr/sbin/atd -f
root       586  0.0  0.3  72308  6244 ?        Ss    2021   0:01 /usr/sbin/sshd -D
root     12847  0.0  0.0   4528    68 ?        S<   Jan03   0:13 /usr/sbin/atopacctd
root     16306  1.7  1.2 151964 26132 ?        S<sl Apr15 512:03 /usr/local/aegis/aegis_client/aegis_11_25/AliYunDun
root     24143  0.0  0.4  25608  8652 ?        S<Ls 00:00   0:03 /usr/bin/atop -R -w /var/log/atop/atop_20220505 600
root     24901  0.0  0.3 107792  7008 ?        Ss   15:37   0:00 sshd: root@pts/0
root     24903  0.0  0.3  76532  7580 ?        Ss   15:37   0:00 /lib/systemd/systemd --user
root     24904  0.0  0.1 111520  2392 ?        S    15:37   0:00 (sd-pam)
以上内容是通过ps aux命令输出到nowcoder.txt文件中的,请你写一个脚本计算一下所有进程占用内存大小的和。
示例1

输入

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.4  77744  8332 ?        Ss    2021   1:15 /sbin/init noibrs splash
root         2  0.0  0.0      0     0 ?        S     2021   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        I<    2021   0:00 [kworker/0:0H]
daemon     486  0.0  0.1  28340  2372 ?        Ss    2021   0:00 /usr/sbin/atd -f
root       586  0.0  0.3  72308  6244 ?        Ss    2021   0:01 /usr/sbin/sshd -D
root     12847  0.0  0.0   4528    68 ?        S<   Jan03   0:13 /usr/sbin/atopacctd
root     16306  1.7  1.2 151964 26132 ?        S<sl Apr15 512:03 /usr/local/aegis/aegis_client/aegis_11_25/AliYunDun
root     24143  0.0  0.4  25608  8652 ?        S<Ls 00:00   0:03 /usr/bin/atop -R -w /var/log/atop/atop_20220505 600
root     24901  0.0  0.3 107792  7008 ?        Ss   15:37   0:00 sshd: root@pts/0
root     24903  0.0  0.3  76532  7580 ?        Ss   15:37   0:00 /lib/systemd/systemd --user
root     24904  0.0  0.1 111520  2392 ?        S    15:37   0:00 (sd-pam)

输出

3.1
内存的大小不是应该是4列,为什么是第6列?????????
mwopr@devops:~$ ps aux |head

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.1  0.0 120012  6156 ?        Ss    2020 153:33 /sbin/init
root          2  0.0  0.0      0     0 ?        S     2020   0:07 [kthreadd]
root          3  0.0  0.0      0     0 ?        S     2020   0:55 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<    2020   0:00 [kworker/0:0H]
root          8  0.0  0.0      0     0 ?        S     2020  37:07 [rcu_sched]
root          9  0.0  0.0      0     0 ?        S     2020   0:00 [rcu_bh]
root         10  0.0  0.0      0     0 ?        S     2020   0:59 [migration/0]
root         11  0.0  0.0      0     0 ?        S     2020   0:16 [watchdog/0]
root         12  0.0  0.0      0     0 ?        S     2020   0:15 [watchdog/1]

发表于 2021-02-24 16:17:49 回复(5)
awk '{a+=$6}END{print a}'
发表于 2020-12-04 22:41:03 回复(0)
# 方法1: 使用awk进行运算比较好, 因为shell中本身是没有浮点运算的,只能借助awk或者bc工具
# 先把初始化写好 BEGIN{sum=0.0} # 初始化变量
# 再把最终的输出写好 END{print sum} # 最后打印变量
# 然后过滤出符合条件的行, 因为第一行不能用来计算: if (NR>1) {#这里面处理} ---简化后---> NR>1
# 然后将第4列的数据累加起来也就是:{sum+=$4}
# 写全一点就是:
awk 'BEGIN{sum=0.0} {if(NR>1){sum+=$4}} END{print sum}' nowcoder.txt
# 简化后是:
awk 'BEGIN{sum=0.0} NR>1 {sum+=$4} END{print sum}' nowcoder.txt

# 2023年3月13日16:04:08

发表于 2023-03-13 16:06:04 回复(0)
awk '{SUM+=$6}END{print SUM}' nowcoder.txt

看到有小伙伴纠结第4列还是第6列的问题,这里解释一下:
%MEM 进程的内存占用率
RSS 进程使用的驻留集大小或者是实际内存的大小,Kbytes字节。
发表于 2021-12-03 16:09:41 回复(0)

现实用法, 计算单个用户的内存使用总和:

$ awk '{sum += $1} END {print sum}'< <(ps -u <account> -o pmem)
编辑于 2021-01-21 21:27:45 回复(0)
sum=0;for i in `awk '{print $6}' nowcoder.txt`;do ((sum+=$i));done;echo $sum
sum=0;while read p; do ((sum+=$(echo $p|awk '{print $6}')));done < nowcoder.txt ;echo $sum
awk '{sum+=$6}END{print sum}' nowcoder.txt
awk 'BEGIN{sum=0}{sum+=$6}END{print sum}' nowcoder.txt
sum=0;while read line;do arr=($line);((sum+=arr[5])); done<nowcoder.txt;echo $sum
sum=0;while read line;do arr=(${line[@]});sum=$(($sum+arr[5])); done<nowcoder.txt;echo $sum #(最优解)

发表于 2021-06-03 21:53:07 回复(1)
awk '{sum+=$6} END {print sum}' nowcoder.txt
发表于 2021-03-08 03:42:59 回复(2)
awk 'BEGIN {sum=0} /[0-9]/ {sum+=$4} END{print sum}' nowcoder.txt


发表于 2023-01-06 18:21:11 回复(0)
#!/bin/bash
count=0
for i in `cat nowcoder.txt | awk '{print $6}'`
do
    count=`echo $count + $i | bc`
done
echo $count

发表于 2021-09-04 23:58:22 回复(0)
cat $1|awk -F ' ' '{(sum=sum+$6)}END{print sum}'
发表于 2020-11-12 21:17:56 回复(5)
awk '{print $4}'| awk 'NR>1 {sum+=$1} END {print sum}'
发表于 2024-10-30 11:09:22 回复(0)
题目改了,用第四列才对
#!/bin/bash
sum=0
for i in `awk '{print $4}' nowcoder.txt | sed  1d`
do
    sum=$(echo "$i+$sum" | bc)
done
echo $sum
发表于 2023-10-07 20:39:31 回复(0)
awk 'NR>1{sum+=$4}END{print sum}'

发表于 2025-11-07 16:03:51 回复(0)
新版题解:awk '{a+=$4}END{print a}'
发表于 2025-07-04 15:35:43 回复(0)
#!/bin/bash

awk '{sum+=$4}END{print sum}' nowcoder.txt

发表于 2025-06-09 15:39:28 回复(0)
cat nowcoder.txt|grep -v "^USER" |awk '{ sum += $4} END {print sum}'
发表于 2025-02-11 18:59:12 回复(0)
#!/bin/bash
awk 'BEGIN{sum=0}{sum+=$4}END{print sum}' nowcoder.txt
发表于 2024-11-25 18:25:47 回复(0)
awk 'BEGIN{SUM=0}{SUM+=$4}{print SUM}END{print SUM}' nowcoder.txt | awk '{line=$0} END{print line}'
发表于 2024-08-13 22:43:22 回复(0)
awk 'NR>1{sum+=$4} END {print sum}'
发表于 2024-06-30 18:17:26 回复(0)
cat nowcoder.txt |awk '
    BEGIN{
        sum=0.0
    }{
        if(NR > 1){
            sum+=$4
        }
    }
    END{
        print sum
    }
'
发表于 2024-06-29 20:59:51 回复(0)