我需要使用以下命令从Unix top
命令中获取线程总数:
$ top -n 1 -H | grep -oP "(?<=Threads:).*(?=total)" | sed 's: ::g'
460
故障:
top -n 1 -H
返回线程部分的第一行(“线程:111total”中的111
)
$ top -H
top - AA:BB:CC up X day, A:BB, A users, load average: 0.30, 0.24, 0.20
Threads: 111 total, A running, XYZ sleeping, 0 stopped, 0 zombie
grep -oP "(?<=Threads:).*(?=total)"
从#1中提取“ 111”
sed 's: ::g'
删除空格(Source)
问题是此“ 111”输出不是数字,当我尝试对其进行算术运算时:
$ echo $((variable + 1))
bash: 111: syntax error: operand expected (error token is "111")
如何将其转换为整数?
我不同意这只是将正则表达式结果转换为整数。每当我尝试按原样打印变量时:
$variable
bash: $'\E(B\E[m\E[39;49m\E[1m111\E(B\E[m\E[39;49m': command not found
我尝试了以下方法:
$ expr $((variable - 1))
bash: 111: syntax error: operand expected (error token is "111")
bc
:
$ echo "$variable" | bc
(standard_in) 1: illegal character: ^[
(standard_in) 1: illegal character: ^[
(standard_in) 1: syntax error
(standard_in) 1: illegal character: ^[
(standard_in) 1: syntax error
(standard_in) 1: illegal character: ^[
(standard_in) 1: syntax error
(standard_in) 1: illegal character: ^[
(standard_in) 1: illegal character: ^[
(standard_in) 1: syntax error
(standard_in) 1: illegal character: ^[
(standard_in) 1: syntax error
我想它甚至都不是字符串。
由于@maihnabunash的question,我终于找到了解决方案。允许我在格式化 grep
输出中使用算术运算的最终脚本是:
variable=$(top -n 1 -H | grep "Threads" | awk '{print $2}')
我通过搜索该系列字符代表的任何“ {\E(B\E[m\E[39;49m\E[1m
”来发现这一点。
另一种方法是在原始脚本中为-b
添加批次top
属性:
top -n 1 -H -b | grep -oP "(?<=Threads:).*(?=total)" | sed 's: ::g'