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

时间:2015-04-22 10:37:55

标签: linux bash shell awk

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

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

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

我迷失在这里:$param我不知道如何将它从stdin中删除,我也不知道如何根据每个lsof -a -p结果对wc -l进行分组,而不是总结果 - 我期望每个进程打开文件的数量,而不是所有进程。

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

123 foo-exe
234 bar-exe

(第一栏pid,第二名) 结果像

123 foo-exe 1234
234 foo-exe 12344

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

1 个答案:

答案 0 :(得分:2)

假设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 %10d\n", pid, cmd[pid], count[pid];}}'