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