2

我正在尝试编写一个命令,为我提供一些有关 linux 系统的信息。该命令应该是单行的。它应该代表中断、进程和上下文切换的总量。

我对 linux 世界很陌生,所以这对我来说并不容易。到目前为止,我发现了这个:

cat /proc/stat | grep -E 'ctxt|intr|processes' | \
 perl -nle 'if ($line == /^intr (.*)/) {print $_} else {print $1}'

问题出在最后一部分,else。我对 1 美元的价值不感兴趣,但我应该知道 1 美元中物品的总和。

$1 应该包含以下内容:

8522774 17 6 0 0 0 0 2 0 1 0 1435117 21 103 0 84742 65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

但我不知道如何获得所有这些数字的总和。我相信我应该将它传递给 bc,但我不知道如何管理它。

4

3 回答 3

7

你的单行:

cat /proc/stat | grep -E 'ctxt|intr|processes' | \
perl -nle 'if ($line == /^intr (.*)/) {print $_} else {print $1}'

这一行的问题是 perl 没有隐式变量$line,它被调用$_。此外,正则表达式适用于具有绑定运算符的字符串=~,而不是数字相等运算符==。您的 if 语句是相反的,如果正则表达式不匹配,您不想打印$1,因为那是您最后一个正则表达式中括号捕获的字符串。

您也不需要使用cator grep,因为 perl 可以很好地处理这个问题。

perl -nlwe 'if (/ctxt|processes/) { print } 
            elsif (/^intr (.*)/ { print $1 }' /proc/stat

这个单行应该完全按照您的行所做的,因为它“greps”匹配的行ctxt|intr|processes,并且只打印“intr”行的匹配。

如果你想打印某些数字的总和,这对我来说感觉像是一个全新的问题,你可以使用perl 模块中的sum()子例程。List::Util例如:

perl -MList::Util=sum -nlwe 'if (/ctxt|processes/) { print } 
            elsif (/^intr (.*)/ { print sum split ' ', $1 }' /proc/stat

在这种情况下,您需要依靠捕获的字符串来仅包含数字。sum()接受一个数字列表,这就是我们需要拆分输入的原因。

于 2013-02-13T13:08:05.400 回答
3

这个怎么样:

awk '/^intr/ {for(i=2;i<=NF;++i) sum+=$i; print "intr",sum}
     /^processes|ctxt/ {print}' /proc/stat

您通常不必调用bcfrom perl,但您的整体方法可能是“流程越多越好”的原因。

于 2013-02-13T12:57:05.957 回答
-3
cat /proc/stat | grep -E 'ctxt|intr|processes' | 
    perl -nle 'if ($line == /^intr (.*)/) {print $_} else {print $1}' | 
    sed 's/ /+/g' | bc
于 2013-02-13T12:57:33.323 回答