免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4118 | 回复: 14
打印 上一主题 下一主题

求awk对文本重新排序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-22 13:00 |只看该作者 |倒序浏览
5可用积分
本帖最后由 waily 于 2012-03-22 15:00 编辑

文本如下,其实就是个pid为123下面的进程树
  1. # cat /tmp/test
  2. oss(123)|-mysqld_safe(3197)---mysqld(3286)-+-{mysqld}(3288)
  3.         |                                  |-{mysqld}(3289)
  4.         |                                  |-{mysqld}(3290)
  5.         |                                  |-{mysqld}(3291)
  6.         |                                  |-{mysqld}(3293)
  7.         |                                  |-{mysqld}(3295)
  8.         |                                  |-{mysqld}(3296)
  9.         |                                  |-{mysqld}(3297)
  10.         |                                  `-{mysqld}(3298)
  11.         |--pcscd(2110)---{pcscd}(2126)
复制代码
要求按进程树的级别倒过来显示pid,同一级的显示次序无所谓,显示结果应该类似是这样:


  1. 3288
  2. 3289
  3. 3290
  4. 3291
  5. 3293
  6. 3295
  7. 3296
  8. 3297
  9. 3298--------------从3288到这里是最后一级
  10. 3286
  11. 2126--------------3286和2126是第二级
  12. 3197
  13. 2110--------------3197和2110是第一级子进程
  14. 123
复制代码

最佳答案

查看完整内容

刷分.sh:第一行第一个分支为什么是"|"不是加号??不知道你输出的具体规则。 根据你这个例子,典型的HardCode, 追求简单不算严密,前提是最深层的"+"号最早被展开。sort可用规则为深度和进程号,具体规则自己控制。awk就是C, 在shell版没啥意义

论坛徽章:
0
2 [报告]
发表于 2012-03-22 13:00 |只看该作者
本帖最后由 MeaCulpa 于 2012-03-23 09:35 编辑

刷分.sh:
  1. awk '
  2. BEGIN { FS="||(-)+"; NXTBASE=0 }
  3. !/\+/ { NXTBASE = 0; }
  4. {
  5.     for (i=1; i <= NF; i++)
  6.     {
  7.         if ($i == "+"){ NXTBASE == i - 1;}
  8.         else if ( match( $i, "\\([0-9]+\\)" ) )
  9.         {
  10.             print NXTBASE+i, substr($i,RSTART+1,RLENGTH - 2);
  11.         }
  12.     }
  13. }
  14. ' $* | sort -r | cut -d' ' -f2
复制代码
第一行第一个分支为什么是"|"不是加号??
不知道你输出的具体规则。 根据你这个例子,典型的HardCode, 追求简单不算严密,前提是最深层的"+"号最早被展开。
sort可用规则为深度和进程号,具体规则自己控制。

awk就是C, 在shell版没啥意义

论坛徽章:
0
3 [报告]
发表于 2012-03-22 13:54 |只看该作者
3298--------------这里是最后一级 ??????????
3289
3290
3291
3293
3295
3296
3297
3298 从树上来看是同级别啊???????????????

论坛徽章:
0
4 [报告]
发表于 2012-03-22 15:01 |只看该作者
不好意思,重新编辑了一下,刚才有点敲错了

从3288,.....到3298都是最后一级子进程
回复 2# nuclearxin


   

论坛徽章:
0
5 [报告]
发表于 2012-03-22 15:05 |只看该作者
3298--------------从3288到这里是最后一级  
~~~~~~~~~
3288 是???
看不懂题

论坛徽章:
0
6 [报告]
发表于 2012-03-22 15:18 |只看该作者
本帖最后由 yuhuohu 于 2012-03-22 15:19 编辑

回复 4# nuclearxin


    我看懂了,我不会做

oss(123)|-mysqld_safe(3197)---mysqld(3286)-+-{mysqld}(3288)

                第一级子进程 -----------第二级子进程------------第三级子进程

                |--pcscd(2110)---{pcscd}(2126)
                 第一级子进程               第二级子进程,这行没有第三级子进程

论坛徽章:
0
7 [报告]
发表于 2012-03-23 09:35 |只看该作者
回复 6# MeaCulpa


    其实我的最初目的是想杀死以某个进程为根的下面所有进程,我觉得要倒过来杀才保险,所以才有上述需求,谢谢哥们

论坛徽章:
0
8 [报告]
发表于 2012-03-23 09:43 |只看该作者
本帖最后由 yuhuohu 于 2012-03-23 09:45 编辑

回复 2# MeaCulpa


    谁给解释一下BEGIN { FS="||(-)+"; NXTBASE=0 }


FS="||(-)+" 看不太明白(-)+是说1~N个-符号,||是说两个||吗还是有特殊含义

论坛徽章:
0
9 [报告]
发表于 2012-03-23 10:19 |只看该作者
本帖最后由 MeaCulpa 于 2012-03-23 10:50 编辑
yuhuohu 发表于 2012-03-23 09:43
回复 2# MeaCulpa


FS代表分隔符。 “|”或者若干个"-" 作为分隔符。“||” 中的后一个“|”是正则【或】

NXTBASE其实是记录加号出现的位置,一旦出现加号,下面的层次就要依据加号的位置往下

上面的脚本有bug, 一旦一行有两个路过的"|", 就不对了,大清早的...我再想想...

大概要拿这样的测试


  1. oss(123)|-mysqld_safe(3197)-+-mysqld(3286)-+-{mysqld}(3288)
  2.         |                   |              |-{mysqld}(3289)
  3.         |                   |              |-{mysqld}(3290)
  4.         |                   |              |-{mysqld}(3291)
  5.         |                   |              |-{mysqld}(3293)
  6.         |                   |              |-{mysqld}(3295)
  7.         |                   |              |-{mysqld}(3296)
  8.         |                   |              |-{mysqld}(3297)
  9.         |                   |              |-{mysqld}(3298)
  10.         |                   |
  11.         |                   |--{mysqld}(3199)---{mysqld}(3200)
  12.         |
  13.         |--pcscd(2110)---{pcscd}(2126)

复制代码

论坛徽章:
0
10 [报告]
发表于 2012-03-23 10:59 |只看该作者
回复 9# MeaCulpa


    很感谢,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP