免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
打印 上一主题 下一主题

awk 递归支持的如何? [复制链接]

论坛徽章:
0
41 [报告]
发表于 2007-01-19 16:52 |只看该作者
原帖由 awk就是awp加ak 于 2007-1-19 16:42 发表

Eden 15F 的代码,还是递归 ^_^


...那是你的代码- -##

这是我的, 还是递归, 嘿嘿

  1. ps -eo pid,ppid | sed 1d | sort -k2,2n | awk '
  2. function listChilds(pPid,     child, cno, i)
  3. {
  4.     if (pPid in proc)
  5.         cno = split(proc[pPid], child, ":");
  6.     else
  7.         cno = 0;

  8.     if (cno > 0)
  9.         for (i = 2; i <= cno; i++)
  10.         {
  11.             listChilds(child[i]);
  12.         }
  13. }

  14. {
  15.     proc[$2] = proc[$2] ":"$1;
  16. }
  17. END {
  18.     listChilds(1);
  19. }
  20. '
复制代码

论坛徽章:
0
42 [报告]
发表于 2007-01-19 16:53 |只看该作者
没人看我这段代码 -_-!
  1. #!/bin/bash
  2. ps -eo pid,ppid |
  3. awk '
  4. function listchildpid(pid){
  5.         if ($2 == pid) {
  6.                 print $1;
  7.                 a[$1]=$1;
  8.         }
  9. }
  10. {
  11.         a[upid]=upid;
  12.         for(i in a){
  13.                 listchildpid(i);
  14.         }
  15. }
  16. ' upid=$1
复制代码

感觉这种方法才更符合awk的思想,而前面我们想的各种递归方法,都绕了圈子。

论坛徽章:
0
43 [报告]
发表于 2007-01-19 16:57 |只看该作者
原帖由 一梦如是 于 2007-1-19 16:53 发表
没人看我这段代码 -_-!
[code]#!/bin/bash
ps -eo pid,ppid |
awk '
function listchildpid(pid){
        if ($2 == pid) {
                print $1;
                a[$1]=$1;
        }
}
{
    ...



就是说这段不明白意图...

论坛徽章:
0
44 [报告]
发表于 2007-01-19 17:06 |只看该作者
原帖由 Edengundam 于 2007-1-19 16:52 发表


...那是你的代码- -##

这是我的, 还是递归, 嘿嘿
[code]
ps -eo pid,ppid | sed 1d | sort -k2,2n | awk '
function listChilds(pPid,     child, cno, i)
{
    if (pPid in proc)
        cno = s ...

我测试没输出?有什么说明吗?

论坛徽章:
0
45 [报告]
发表于 2007-01-19 17:09 |只看该作者
原帖由 Iambitious 于 2007-1-19 16:47 发表
还有个简单的办法可以实现这个递归的功能
就是对于每一个进程存它的父进程号,存到数组中.
然后遍历所有进程,判断是否此进程的某个祖先进程为我们预先定义的进程
如果是,输出此进程,否则,对下一个进程进行如上判 ...

一下子理解不过来,简单实现一下看看

论坛徽章:
0
46 [报告]
发表于 2007-01-19 17:10 |只看该作者
原帖由 awk就是awp加ak 于 2007-1-19 17:06 发表

我测试没输出?有什么说明吗?



我没加打印代码....^_^
我觉得如何打印一个漂亮的结果...比取得结果更加伤神....T_T

ps: 我其实就是构建了一颗树把结果存好, 最后根据需要把结果输出的

[ 本帖最后由 Edengundam 于 2007-1-19 17:13 编辑 ]

论坛徽章:
0
47 [报告]
发表于 2007-01-19 17:12 |只看该作者
原帖由 一梦如是 于 2007-1-19 16:53 发表
没人看我这段代码 -_-!
[code]#!/bin/bash
ps -eo pid,ppid |
awk '
function listchildpid(pid){
        if ($2 == pid) {
                print $1;
                a[$1]=$1;
        }
}
{
    ...

我正在读。。

论坛徽章:
0
48 [报告]
发表于 2007-01-19 17:12 |只看该作者
原帖由 Edengundam 于 2007-1-19 17:10 发表



我没加打印代码....^_^
我觉得如何打印一个漂亮的结果...比取得结果更加伤神....T_T

我没注意,c&p 就测试了,哈哈

论坛徽章:
0
49 [报告]
发表于 2007-01-19 17:18 |只看该作者
#!/bin/bash

if [ "$1x" = "x" ];then
        target=0
else
        target=$1
fi
ps -ef | awk '{if (NR > 1) {print $2 " " $3}}' > relation
index=0
parent[0]=-1
while read c p;do
        parent[$c]=$p
        child[$index]=$c
        ((index++))
done < relation

for((i=0;i<index;i++));do
        cur=${child[$i]}
        while [ $cur -ge 0 ];do
                if [ $cur -eq $target ];then
                        echo ${child[$i]}
                        break
                fi
                cur=${parent[$cur]}
        done               
done

论坛徽章:
0
50 [报告]
发表于 2007-01-19 17:19 |只看该作者
原帖由 一梦如是 于 2007-1-19 16:53 发表
没人看我这段代码 -_-!
[code]#!/bin/bash
ps -eo pid,ppid |
awk '
function listchildpid(pid){
        if ($2 == pid) {
                print $1;
                a[$1]=$1;
        }
}
{
    ...

确实,这种方法直接找到就输出了,没有必要缓存起来,也没有必要递归 ^_^
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP