如何在 bash 中管道自定义脚本



我有文件,其中每一行都是某个进程的pid。我想要实现的是显示文件描述符摘要。

所以基本上我的步骤是这样的:

ps -aux | grep -E 'riak|erlang' | tr -s " " | cut -f2 -d " " | xargs lsof -a -p $param | (wc -l per process)

我在这里迷路了:$param我不知道如何从 stdin 中放置它,我也不知道如何使 wc -l 按每个lsof -a -p结果分组,而不是总结果 - 我期待每个进程打开的文件数量,而不是全部。

奖励问题:如何转换此类输入:

123 foo-exe
234 bar-exe

(第一列 pid,第二个名称)结果像

123 foo-exe 1234
234 foo-exe 12344

其中第一列是 PID,第二列是名称,第三列是打开的文件数。我知道这可能是不同的方法(我想知道),但知道如何使用 bash 工具做到这一点会很好:)

假设 riak、erlang 是用户名。

ps -e -o pid=,comm= -U riak,erlang | while read pid comm; do lsof=`lsof -a -p $param | wc -l`; echo $pid $comm $lsof; done

纯基于 lsof+awk 的方法(应该比以前的方法更快)。

{ lsof -u riak +c 0; lsof -u erlang +c 0; } | awk '{cmd[$2]=$1;count[$2]++;}function cmp_num_idx(i1, v1, i2, v2) {return (i1 - i2);} END{PROCINFO["sorted_in"]="cmp_num_idx"; for (pid in cmd){ printf "%10d %20s %10dn", pid, cmd[pid], count[pid];}}'

相关内容

  • 没有找到相关文章

最新更新