gpt4 book ai didi

linux - 如何正确地将 bash 数组传递给 awk

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:46:26 31 4
gpt4 key购买 nike

我的目标是创建一个脚本,列出前 5 个最消耗内存的进程及其 PID、Mem ifnos 和 Swap 消耗。部分地,我已经完成了。但是现在,我想在 bash/awk 中将其输出到一个文件中。Awk 看不到传递的 bash 数组。这是我的方法:

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 sw 中拆分为 var a

最佳答案

这里,

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

关于linux - 如何正确地将 bash 数组传递给 awk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43873547/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com