1

我有这个代码:

total=0;
ps -u $(whoami) --no-headers | awk {'print $1'} | while read line; 
                          do vrednost=$(pmap $line | tail -n1 | column -t | cut -d" " -f3 | tr "K" " "); 
                          total=$(( vrednost + total ))
                          echo $total 
                          done
                          echo total: $total

如您所见,我的代码总结了我所有进程的使用情况。当我每次都回显我的总数时,它工作正常,但最后......当我希望总数成为一个值(echo total: $total)时,它仍然为零。但在 (in while) 之前具有正确的值。

4

5 回答 5

1

好吧,挑挑拣拣。您可以在 BASH 或 AWK 中执行此操作,但不要同时执行。您已经看到了一个 BASH 示例,这是一个 AWK 示例:

ps  -e -o user -o vsz | awk -v USER="$(whoami)" '
    BEGIN {TOTAL = 0}
    END {print "Total is " TOTAL}
    {
        if ($1 == USER) {
            TOTAL += $2
        }
    }
'

awk 就像一种编程语言,它假设一个循环(如perl -n)并处理文件中的每一行。每个字段(通常由空格分隔)都有一个$变量。第一个是$1,第二个是$2,等等。

-v选项允许我在USER运行 awk 之前定义一个 awk 变量(在本例中)。

BEGIN行是我在运行awk脚本之前想要做的。在这种情况下,初始化TOTAL为零。(注意:这实际上没有必要,因为未定义的变量会自动赋予零值)。这END条线是我之后想要做的。在这种情况下,打印出我的总数。

因此,如果第一个字段 ($1) 等于我的用户,我会将第二个字段 (vsize) 添加到我的总数中。

所有 awk 程序都被包围,{...}并且它们通常有单引号,以防止 shell 插值$1等。

于 2012-05-30T23:44:34.057 回答
0

让我们减少您需要的额外进程的数量:)

declare -i total=0
for size in $( ps -u $(whoami) --no-header -o vsz ); do
    total+=$size
done
echo $total

首先,使用各种选项ps来生成所需的进程大小列表(以千字节为单位)。使用 bash for 循环遍历该列表,在使用“整数”属性声明的参数中保留运行总计,以便于算术。所需的金额现在在 中total,可用于您需要的任何用途。总和包括ps进程本身使用的内存。

使用while(Dennis 的建议)并避免流程替换(William 的建议):

ps -u $(whoami) --no-header -o vsz | { 
  while read -r var; do
    ((total+=$var))
  done
  echo $total
}

(对于真正的单线,这是我从https://stackoverflow.com/a/453290/1126841dc借来的命令:

ps -u $(whoami) --no-header -o vsz | dc -f - -e '[+z1<r]srz1<rp'

这个总和包括psanddc命令本身使用的内存。)

于 2012-05-30T22:27:24.457 回答
0

尝试这个

#!/bin/bash
total=0;
for line in `ps -u $(whoami) --no-headers | awk {'print $1'}`; 
do 
  vrednost=$(pmap $line | tail -n1 | column -t | cut -d" " -f3 | tr "K" " "); 
      total=$(( $vrednost + $total ))
      echo $total 
done
echo "total: $total"
于 2012-05-30T21:33:37.603 回答
0

Ignacio 的回答很好,但过程替换不可移植。还有一个更简单的解决方案。您需要在计算它的同一子shell中回显总数:

... | { while read line; do ...; done; echo total: $total; }
于 2012-05-31T14:09:00.487 回答