Chinaunix
标题:
请教如何利用grep|sed匹配多个,每个匹配打印出前几行后几行可以定义成不一样的
[打印本页]
作者:
kingoftime3
时间:
2014-01-24 10:14
标题:
请教如何利用grep|sed匹配多个,每个匹配打印出前几行后几行可以定义成不一样的
grep可以-a -b参数来定义,也可以用grep 'aaa|bbb'来匹配多个,但我想要对于每个匹配,打印前几行和后几行可自定义
例如 seq 10, 我想打印匹配2的后两行,匹配5的前一行和后一行,请教如何去做
作者:
q1208c
时间:
2014-01-24 10:39
这怕是得自己写程序来搞了.
作者:
wang390750
时间:
2014-01-24 10:50
本帖最后由 wang390750 于 2014-01-24 11:46 编辑
seq 10 | awk '/2/{T=NR}T&&(NR==T+1||NR==T+2){print $0}/5/{t=NR}{s[NR]=$0}END{print s[t-1]"\n"s[t+1]}'
复制代码
作者:
jason680
时间:
2014-01-24 10:55
本帖最后由 jason680 于 2014-01-24 11:28 编辑
回复
1#
kingoftime3
which one do you like
$ seq 10 | awk -vA=-1 -vbuf=10 '/^
2
$/{
B=0;A=2
}/^
5
$/{
B=1;A=1
}B{for(n=1;n<=B;n++)print a[buf-n+1];B=0}{for(n=1;n<buf;n++)a[n]=a[n+1];a[buf]=$0}A-->=0'
2
3
4
4
<=== overlay
5
6
$ seq 10 | awk -vA=-1 -vbuf=10 '
/^2$/{B=0;A=2}/^5$/{B=1;A=1}
B{for(n=1;n<=B;n++)if(!p[buf-n+1]){print a[buf-n+1];p[buf]=1};B=0}{for(n=1;n<buf;n++){a[n]=a[n+1];p[n]=p[n+1]};a[buf]=$0;if(A--<0){p[buf]=0}else{print$0;p[buf]=1}}'
2
3
4 <===without overlay issue
5
6
作者:
yestreenstars
时间:
2014-01-24 11:01
目测一下:
$ seq 10 | grep -A 2 2
2
3
4
$ seq 10 | grep -A 1 -B 1 5
4
5
6
$ seq 10 | awk -vA=2 -vB=0 -vX=2 '{a[NR]=$0}END{for(i=X-B;i<=X+A;i++)print a[i]}'
2
3
4
$ seq 10 | awk -vA=1 -vB=1 -vX=5 '{a[NR]=$0}END{for(i=X-B;i<=X+A;i++)print a[i]}'
4
5
6
复制代码
作者:
Shell_HAT
时间:
2014-01-24 11:16
回复
5#
yestreenstars
楼主需要把第一个grep和第二个grep合并在一起
作者:
wang390750
时间:
2014-01-24 11:24
回复
6#
Shell_HAT
大神,可以帮忙看看代码吗?
[root@localhost 桌面]# seq 10 | awk '/7/{T=NR}T&&NR==T+1||NR==T+2{print $0}/6/{t=NR}{s[NR]=$0}END{for(a in s)if(a==t)print s[a-1]"\n"s[a+1]}'
2
8
9
5
7
复制代码
为什么我匹配7的时候 怎么把2打印出来了?
作者:
jason680
时间:
2014-01-24 11:41
本帖最后由 jason680 于 2014-01-24 11:41 编辑
回复
7#
wang390750
debug by yourself
$ seq 10 | awk '/7/{T=NR}T&&NR==T+1||NR==T+2{print "NR="NR",T="T",$0=";print$0}/6/{t=NR}{s[NR]=$0}END{for(a in s)if(a==t)print s[a-1]"\n"s[a+1]}'
NR=2,
T=,
$0=
2
NR=8,T=7,$0=
8
NR=9,T=7,$0=
9
5
7
作者:
wang390750
时间:
2014-01-24 11:44
回复
8#
jason680
呵呵,弄半天是&& || 优先级问题。
作者:
kingoftime3
时间:
2014-01-24 11:47
回复
7#
wang390750
在扫到第二行的时候NR==T+2为true
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2