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 编辑
  1. 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
目测一下:
  1. $ seq 10 | grep -A 2 2
  2. 2
  3. 3
  4. 4
  5. $ seq 10 | grep -A 1 -B 1 5
  6. 4
  7. 5
  8. 6
  9. $ seq 10 | awk -vA=2 -vB=0 -vX=2 '{a[NR]=$0}END{for(i=X-B;i<=X+A;i++)print a[i]}'
  10. 2
  11. 3
  12. 4
  13. $ seq 10 | awk -vA=1 -vB=1 -vX=5 '{a[NR]=$0}END{for(i=X-B;i<=X+A;i++)print a[i]}'
  14. 4
  15. 5
  16. 6
复制代码

作者: Shell_HAT    时间: 2014-01-24 11:16
回复 5# yestreenstars


    楼主需要把第一个grep和第二个grep合并在一起
作者: wang390750    时间: 2014-01-24 11:24
回复 6# Shell_HAT


    大神,可以帮忙看看代码吗?
  1. [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. 2
  3. 8
  4. 9
  5. 5
  6. 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