我试图写一个命令,给我一些关于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