Bash 从ps faux输出解析数据(不确定如何awk!)

Bash 从ps faux输出解析数据(不确定如何awk!),bash,parsing,awk,scripting,grep,Bash,Parsing,Awk,Scripting,Grep,所以我一直在做一个基于ps faux输出的反向工程脚本。我已经让它大部分工作,但我遇到了一个问题,它如何计算PHP进程。例如,这是我试图复制的脚本的输出: Top-SQL Apache统计数据:CPU%:0 | Mem%:1.8 PHP统计总数:CPU%:0 | Mem%:83.9 顶级PHP用户 391用户->CPU%:0 |内存%:83.9 顶级PHP脚本 307/home/user/public_html/gg/ajax_calls2.php->CPU%:0 | Mem%:70.7 36/

所以我一直在做一个基于ps faux输出的反向工程脚本。我已经让它大部分工作,但我遇到了一个问题,它如何计算PHP进程。例如,这是我试图复制的脚本的输出:

Top-SQL
Apache统计数据:CPU%:0 | Mem%:1.8
PHP统计总数:CPU%:0 | Mem%:83.9
顶级PHP用户
391用户->CPU%:0 |内存%:83.9
顶级PHP脚本
307/home/user/public_html/gg/ajax_calls2.php->CPU%:0 | Mem%:70.7
36/home/user/public_html/gg/support/crm/index.php->CPU%:0 | Mem%:5
8/home/user/public_html/gg/support/advanced_search.php->CPU%:0 | Mem%:1.5

我遇到的最大问题是为每个用户获取正在运行的php脚本,然后计算每个进程并统计每个进程的CPU/MEM使用情况。到目前为止,我编写的AWK语句只为每个用户输出一个脚本,而不是为每个用户输出所有脚本

这就是我到目前为止所做的:

变量声明:

函数join2{local IFS=“$1”shift;echo“$*”;};ix=“0”;ixx=“5”;count=“0”;count2=$(ps faux | egrep-w'usr/bin/php |/opt/php*/bin/'awk'{打印$1、$3、$4、$14、$15}| wc-l)

首先,我将ps faux中的所有PHP进程存储在一个数组中:

initialARRAY=($(ps faux | egrep-w'usr/bin/php |/opt/php*/bin/'awk'{print$1、$3、$4、$14、$15})

然后我编写了一个循环,将数组的元素连接到一行中(因为数组将每个字段分隔在不同的行中),这样每个数组元素就是ps faux中的整个PHP脚本行:

而[[$count-lt$count2]];domemarray+=(“$(join2'${initialARRAY[@]:$ix:$ixx}”);计数=$($count+1));ix=$($ix+5));完成

数组memARRAY的内容如下:

root@server [~]# printf "%s\n" "${memARRAY[@]}"
user 0.0 1.0 /usr/bin/php /home/user/public_html/cart.php
user 0.0 0.9 /usr/bin/php /home/user/public_html/cart.php
user3 0.0 0.2 /usr/bin/php /home/user3/public_html/manager.php
user3 0.0 0.4 /usr/bin/php /home/user3/public_html/manager.php
user3 0.0 0.3 /usr/bin/php /home/user3/public_html/manager.php
user3 0.0 0.2 /usr/bin/php /home/user3/public_html/search.php
user3 0.0 0.1 /usr/bin/php /home/user3/public_html/search.php`
没有间距,因为我不知道如何复制和粘贴到堆栈中,没有奇怪的间距问题

现在,我遇到的问题是,当我试图计算每个用户的进程数时,同时对每个脚本的CPU/MEM使用情况进行计数和求和,最终输出只显示一个脚本,而不是为user3运行的两个脚本

我认为这部分工作不正常:

    for i in $(printf '%s\n' "${memARRAY[@]}" | awk '{print $1}' | sort | uniq ); do echo -e "Resource Usage by Script:\n $(printf '%s\n' "${memARRAY[@]}" | grep ${i} | awk '{ x+=$2; y+=$3; z=$4; w=$5; count++$5 }END{print "     Procs:",count,"",z,w,"","CPU: ",x,"%"," ","MEM:", y,"%"}')\n";done"`
上述行的输出如下所示:

    [[ User Information for: user3 ]]
    Resource Usage by Script:
          Procs: 2  [ /usr/bin/php /home/user3/public_html/search.php ]  CPU:  0 %    MEM:  0.4 %
    [[ User Information for: user ]]
    Resource Usage by Script:
          Procs: 10  [ /usr/bin/php /home/user/public_html/cart.php ]  CPU:  0 %    MEM:  9.9 %`
正如您所见,它只计算和统计了为user3用户运行的两个脚本中的一个。我不知道如何让它计算并输出每个用户的所有脚本


任何帮助都将不胜感激

哦,这里的信息太多了。将其归结为2-4行输入数据(包括一条应在不改变的情况下通过的记录,以及一条应标记为错误的记录)。从这些输入中显示所需的输出,并将代码精简到创建该输出所需的程度。否则,使用awk中的
print“Debug:$0=“$0
类型语句,以及
set-vx;bash_-cmds_-to_测试;设置+vx来调试bash部件。祝你好运。没有实际错误,脚本运行完全正常。如果我必须简单地说,我只需要能够从ps faux输出中获取所有PHP脚本,然后根据用户、命中次数对它们进行排序,并统计每个脚本的总内存/cpu使用量。我在用awk做实验,但遇到了一个死胡同。你知道你可以指定
ps
输出的格式,对吗?是的,我知道,但我试图理解一开始引用的人是如何从ps faux中提取信息的,并将其像那样输出的。除了追踪那个人(不可能),我已经尝试了我所知道的一切。我需要它,以便它将其格式化为以下内容:[#脚本实例][脚本名称][cpu使用情况][内存使用情况]对于ps faux中每个用户的每个脚本。