- 论坛徽章:
- 0
|
grep -A n 'regexp' //过滤匹配的行及之后的n行
grep -B n 'regexp' //过滤匹配的行及之前的n行
cat file
1111
2222
3333
4444
5555
6666
7777
如果只是得到匹配行和前后的一行还好解决!
cat test |sed -n -e '/4444/{x;G;p}' -e 'h' //得到匹配的行及之前的1行
cat test |sed -n '/4444/{N;p}' //得到匹配的行及之后的1行
cat test |sed -n -e '/4444/{x;G;N;p}' -e 'h' //得到匹配的行、前1行和后1行
但是如果匹配前后的n行就头疼了!我想到的办法是用行号计算,而且只能匹配一次。
cat test | sed -n '/4444/='
cat test | sed '='|sed 'N;s/\n/ /'|sed -n -e '/4444/{x;s/\n//;G;p}' -e '/^[2-3]/H' | sed 's/..//'
cat test | sed '='|sed 'N;s/\n/ /'|sed -n -e '/4444/{/\n/!h;N;H;s/\([^\n]\+\)\(\n.*\)/\1/;x;/\n6/{s/[^\n]\+\n//;p};/\n6/!D}' | sed 's/..//'
第一条命令得到匹配4444的行号为4,如果要获取前后两行,计算得到前面的二行行号[2-3],后面的二行行号[5-6]
第二条命令可以得到匹配4444的行和它前面的两行;
第三条命令可以行到匹配4444的行和它后面的两行;
如果要匹配N行,只需重新计算,替换行号范围。
如果哪位大侠有很有效率的方法并得到所有匹配的方法!!!!跪求!!!!!!!!!!!!!1 |
|