2017-05-09 90 views
1

我的目標是創建一個腳本,其中列出了使用其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

+0

試試'交換[J] ... AWK ... <(/ proc/$ i/status | awk'{print int($ 3/1024)}'))'。祝你好運。 – shellter

+0

你是什麼意思,它沒有看到傳遞的bash數組?你會得到什麼輸出?你在期待什麼? – 123

+0

我什麼都看不到,赦免:) –

回答

1

這裏,

awk -v sw="${swap[*]}" -v sep="[:]" 'BEGIN { n = split(sw, a, sep); ... } 

你似乎試圖在冒號分割sw。但"${swap[*]}"將生成一個字符串,其中數組swap的元素與IFS的第一個字符結合,默認情況下爲空格。

因此,在使用"${swap[*]}"之前,您需要將IFS更改爲冒號,或者將分隔符設置爲awk一側的空格。

$ arr=(foo bar) ; IFS=: 
$ awk -v par="${arr[*]}" 'BEGIN{ n = split(par, a, ":"); 
    for (x in a) {printf "%s %s\n", x, a[x]}; exit }' 
1 foo 
2 bar 
+1

'awk -v par =「$(IFS = :; echo」$ {arr [*]}「)」...'避免修改當前shell的IFS –

2

對於某些選項的信息PS可能會給結果

ps -eo pid,%cpu,%mem,vsz,sz,cmd --sort -vsz | head 

而且

j=0 
j+=1 

僅適用於typeset -i j

相關問題