我需要修复以下代码。该代码旨在确定给定节点中可用的核心数量。
步骤1:获取核心数
TC=$(grep -c process /proc/cpuinfo)
第2步:忽略小数点的正常运行时间
LA=$(uptime | cut -d ' ' -f 13 | head -c 1)
步骤3:减去$LA
即可$TC
得到我可以运行的进程数
procs=$(expr $TC - $LA)
我的问题是第 2 步:当我输入 时uptime | cut -d ' ' -f 13 | head -c 1
,我得到a
。这意味着什么?第2步有错误吗?
让我补充一下,如果我简单地输入,uptime
我会得到
23:17:01 up 38 days, 38 min, 8 users, load average: 0.00, 0.00, 0.00
答案1
的输出uptime
包括多个具有可变数量空格的字段。 cut
款待每一个空格作为字段分隔符,因此对其中一些值的更改将意味着您cut
会得出完全不同的数字。
例如,用户数量用空格填充。小于10时,有两个空格;当10个或更多时,只有1个。
$ echo ' 23:17:01 up 38 days, 38 min, 8 users, load average: 0.00, 0.00, 0.00'|cut -d ' ' -f13
average:
$ echo ' 23:17:01 up 38 days, 38 min, 10 users, load average: 0.00, 0.00, 0.00'|cut -d ' ' -f13
0.00,
您可以改为使用awk
,它允许每个字段之间有可变的空间量(并忽略行开头的空间):
$ echo ' 23:17:01 up 38 days, 38 min, 8 users, load average: 0.00, 0.00, 0.00' | awk '{print $11}'
但如果“单词”的数量本身发生变化,这仍然可能会被破坏,例如。当正常运行时间本身不只是几天和几分钟时:
14:51:24 up 4 min, 1 user, load average: 0.17, 0.16, 0.07
14:52:09 up 6 days, 21:58, 11 users, load average: 0.79, 0.84, 0.82
因此,该行上的其他标点符号(逗号和冒号)也可能会发生变化,并且对于查找所需的数字没有任何帮助。
您可以grep -o ...
仅提取后面的单词load average:
,并从中提取正确的单词。但是,如果您的操作系统有这样的文件,那么uptime
完全停止解析 的输出,而是从 中提取负载平均值会简单得多:/proc/loadavg
$ cat /proc/loadavg
1.01 0.91 0.85 1/793 24545
如果您只想要第一个数字,忽略小数点,您可以使用单个cut
:
$ cut -d. -f1 /proc/loadavg
1
答案2
您的剪切命令正在剪切第 13 个字段,但您想要第 14 个字段......
⇨ uptime |cut -d ' ' -f 13
average:
在执行完您的剪切命令之后,您将看到“a”字符。
尝试:
⇨ uptime |cut -d ' ' -f 14
0.18
另请注意,您的 head -c 1 会截掉小数...我认为您最好四舍五入或其他方式。也许看看BC。