当前位置:Linux教程 - Shell - shell - 请问如何抽取特征字的下一行

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

请问如何抽取特征字的下一行
2004-04-23 15:18 pm
来自:Linux文档
现载:Www.8s8s.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