我的目标是创建一个脚本,其中列出了使用其PID,Mem ifnos和Swap消耗的最多内存消耗进程的前5个。部分地,我已经完成了。 但现在,我想在bash/awk中的一个输出中创建它。 awk没有看到传入的bash数组。 这里是我的方法:如何正确地将bash数组传递给awk
echo -e "PID\t%CPU\t%MEM\tMEM\tSWAP\tPROCESS"
pids=($(ps aux | awk 'BEGIN { FS = "[ \t]+" } ; {pid[$11]+=$2}; {mem[$11]+=int($6/1024)}; {cpuper[$11]+=$3};{memper[$11]+=$4}; END {for (i in mem) {print " "pid[i]"\t",cpuper[i]"%\t",memper[i]"%\t",mem[i],i}}' | sort -k4nr | head -n 5|awk '{print $1}'))
swap=()
j=0
for i in "${pids[@]}"
do
:
if [ -f "/proc/$i/status" ]
then
swap[j]=$(awk '/Tgid|VmSwap|Name/{printf $2" "}END{ print ""}' < /proc/$i/status|awk '{print int($3/1024)}')
else
swap[j]=0
fi
j+=1
done
echo ${swap[@]}
ps aux | awk -v sw="${swap[*]}" -v sep="[:]" 'BEGIN { n = split(sw, a, sep); FS = "[ \t]+" } ; {pid[$11]+=$2}; {mem[$11]+=int($6/1024)}; {cpuper[$11]+=$3};{memper[$11]+=$4}; END {for (i in mem) {print " "pid[i]"\t",cpuper[i]"%\t",memper[i]"%\t",mem[i]" MB\t",a[i]" MB",i}}' | sort -k4nr | head -n 5
输出是
PID %CPU %MEM MEM SWAP PROCESS
57551 6.3% 4.7% 9076 MB MB java
478839 1.2% 0% 657 MB MB /usr/sbin/httpd
54418 1.6% 0.2% 524 MB MB /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el7_3.x86_64/jre/bin/java
63047 0.1% 0% 47 MB MB /usr/sbin/mysqld
237334 0% 0% 22 MB MB sshd:
我们看到,有一个缺乏从表swap
信息这似乎是在向分裂VAR a
变种sw
。
试试'交换[J] ... AWK ... <(/ proc/$ i/status | awk'{print int($ 3/1024)}'))'。祝你好运。 – shellter
你是什么意思,它没有看到传递的bash数组?你会得到什么输出?你在期待什么? – 123
我什么都看不到,赦免:) –