| 您的位置:首页 > 文档 > Shell > |
文章分类热门文章 |
请问如何抽取特征字的下一行创建:2005-10-26 00:49:41 作者:Unlinux 来自: http://www.Unlinux.com 在AIX上想看看各process占用的内存大小,用svmon -P看。 但是这样显示的内容太多了,我只需要出现"PID"那一行的下一行就够了。 但是这一行里只有数据,没有特征字,只能依靠上一行的特征字来区分。 用svmon -P|grep PID以后又应该怎么写呢? 请指点。谢谢。 编辑文件awkfile #!/usr/bin/awk -f BEGIN {temp=0} {if(temp!=0} print} {temp=index($0,"PID")} 然后chmod 700 awkfile svmon -P | awkfile OVER! 呵呵,我这里可是测试通过的 with awk: svmon -P|awk '/PID/{getline;print}' with sed: svmon -P|sed '/PID/{N:p;}' 果然比我的简单,pfpf 用sed的,我在bash下怎么报错呀? 我在cygwin的bash下试过.没问题啊,这么简单的语法. 奇怪,{N:p;}是什么意思呀,手册里面没有找到 N是到下一行,p是显示啊. 呵呵,我明白了,你的N后面应该是;,但是写成:了,所以报错 另外,错误虽然没有了 结果有点问题 $ps PID TTY TIME CMD 24451 pts/8 0:00 csh 25202 pts/8 0:00 ps $ps | sed '/PID/{N;p;}' PID TTY TIME CMD 24451 pts/8 0:00 csh PID TTY TIME CMD 24451 pts/8 0:00 csh 25203 pts/8 0:00 ps 25204 pts/8 0:00 sed why? 要加 -n啊. very good! 非常实用。 那不止下一行呢,比如下x行呢 svmon -P|awk '/PID/ {for(i=0;i<x;i++) {getline;print}}' svmon -P|grep -n PID|awk '{cmd=sprintf("svmon -P|head -%d|tail -1",$1); system(cmd)}' 请多指教 我测试了一下Hell的脚本,是打印带有PID的那一行 需求是打印PID行的下n行 怎么样,改进一下吧 svmon -P|grep -n PID|awk '{cmd=sprintf("svmon -P|head -%d|tail -%d",$1+1,n); system(cmd)}' svmon -P|grep -n PID|awk '{cmd=sprintf("svmon -P|head -%d|tail -%d",$1+n,n); system(cmd)}' grep has the function to get the line after the designed lines. grep -A2 PID yourfile grep -A2 PID yourfile |grep -v PID 我的意思是不想要一个文件中包含特征字符串的行和其前后几行 我想肯定有更简单的方法,请赐教 #本程序将按给定的字符串在一文件中将其前后若干行删除 #在h80机器上测试通过,对原有10万行的文本文件,删除其中8万行, #每个特征串删除前后共4行,即共有2万个指定字符串需删除,用时6分钟 cp comlog021211 abab # M 前M行 # N 后N行 # string1 指定字符串 M=3 N=0 string1="发送文件通讯失败" # count 为每次向下走的步数 count=`expr $M + $N + 1` count_ini=0 eval grep -n $string1 abab | awk -F ":" '{print $1}' > acac #为了删除最后一行,在后在加一行 count_tmp=`tail -1 acac` echo $count_tmp >> acac #为bbb,pre赋值 count_tmp=`head -1 acac` bbb=$count_tmp pre=`expr $count_tmp - $count` while read -r aaa do ccc=`expr $pre + $count` if [ $aaa != $ccc ] then CCC=`expr $bbb - $count_ini - $M` DDD=`expr $pre - $count_ini + $N` eval sed '${CCC},${DDD}d' abab > adad count_ini=`expr $count_ini + $DDD - $CCC + 1` cp adad abab bbb=$aaa fi pre=$aaa done < acac 我想肯定有更简单的方法,请赐教 #本程序将按给定的字符串在一文件中将其前后若干行删除 #在h80机器上测试通过,对原有10万行的文本文件,删除其中8万行, #每个特征串删除前后共4行,即共有2万个指定字符串需删除,用时6分钟 cp comlog021211 abab # M 前M行 # N 后N行 # string1 指定字符串 M=3 N=0 string1="aaaaaaaaaaaaa" # count 为每次向下走的步数 count=`expr $M + $N + 1` count_ini=0 eval grep -n $string1 abab | awk -F ":" '{print $1}' > acac #为了删除最后一行,在后在加一行 count_tmp=`tail -1 acac` echo $count_tmp >> acac #为bbb,pre赋值 count_tmp=`head -1 acac` bbb=$count_tmp pre=`expr $count_tmp - $count` while read -r aaa do ccc=`expr $pre + $count` if [ $aaa != $ccc ] then CCC=`expr $bbb - $count_ini - $M` DDD=`expr $pre - $count_ini + $N` eval sed '${CCC},${DDD}d' abab > adad count_ini=`expr $count_ini + $DDD - $CCC + 1` cp adad abab bbb=$aaa fi pre=$aaa done < acac 转载自:http://www.unlinux.com/doc/shell/20051026/57.html 【评论】 【加入收藏夹】 【大 中 小】 【打印】 【关闭】 ※ 相关链接
|