把perl的一部分传给bc

我试图写一个命令,给我一些关于Linux系统的信息。 命令应该是一个class轮。 它应该表示中断,进程和上下文切换的总量。

我对Linux世界很新,所以对我来说这不是一件容易的事情。 到目前为止,我发现这一点:

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

问题是在最后一部分,其他部分。 我对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,但我不知道如何pipe理这个。

你的一行:

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

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

你也不需要使用cat或者grep ,因为perl可以处理这个就好了。

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

这个一行代码应该完全按照你的代码行的方式进行,因为它会“匹配”与ctxt|intr|processes匹配的行,并且仅打印“intr”行的匹配项。

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

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

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

这个怎么样:

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

您通常不必从perl调用bc ,但也许您的总体方法是“流程越多越好”,这是有原因的。

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