请问如何抽取特征字的下一行

王朝other·作者佚名  2008-05-18
宽屏版  字体: |||超大  

在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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
>>返回首页<<
© 2005- 王朝网络 版权所有