ps axo time,vsz,rss,pid,command --no-header | tr -s ' ''_' | sort
显示此输出:
00:00:00 0 0 1021 [nfsiod]
00:00:00 0 0 1052 [lockd]
我想在新列中计算和打印ps输出,rss
(实内存使用)和vsz
(整个过程的虚拟内存使用)之间的关系, ,我做了:
for i in $(ps axo time,vsz,rss,pid,command --no-header | tr -s ' ''_' | sort)
do
var1=$(echo $i | cut -d" " -f2)
var2=$(echo $i | cut -d" " -f3)
result=$(echo "$var2 / $var1" | bc -l)
echo $i $result
done
但是,我得到了一些我不理解的错误,例如:
(standard_in) 1: illegal character: :
(standard_in) 1: syntax error
(standard_in) 1: illegal character: :
00:00:00
Runtime error (func=(main), adr=3): Divide by zero
0
可能指的是这些行
var1=$(echo $i | cut -d" " -f2)
var2=$(echo $i | cut -d" " -f3)
result=$(echo "$var2 / $var1" | bc -l)
感谢您的帮助,谢谢。
答案 0 :(得分:1)
早上好,这与您对for循环的使用有关。用于分隔由空格分隔的每个单词。对于在线上循环,更好地使用,如下所示:
#!/bin/bash
ps axo time,vsz,rss,pid,command --no-header | tr -s ' ''_' | sort | while read line
do
echo $line
var1=$(echo $line | cut -d" " -f2)
var2=$(echo $line | cut -d" " -f3)
if [ $var1 -ne 0 ]
then
result=$(echo "$var2 / $var1" | bc -l)
else
result="N/A"
fi
echo $line $result
done
我还为$ var1 == 0添加了验证。除以0始终是个问题!
答案 1 :(得分:0)
AWK
表达式的简短解决方案:
ps axo time,vsz,rss,pid,command --no-headers --sort=time | awk '{ $(NF+1)=($2==0? 0 : $3/$2) }1'
$(NF+1)
- 指向最后一个添加的字段