你可以分两步完成.基本思路是:
1)获取第一个和最后一个匹配的行号.
2)打印这些范围之间的行范围.
$ read first last <<< $(grep -n stackoverflow your_file | awk -F: 'NR==1 {printf "%d ", $1}; END{print $1}')
$ awk -v f=$first -v l=$last 'NR>=f && NR<=l' your_file
Run Code Online (Sandbox Code Playgroud)
read first last读取两个值并将它们存储在$first和中$last.grep -n stackoverflow your_file greps并显示如下输出: number_of_line:outputawk -F: 'NR==1 {printf "%d ", $1}; END{print $1}')打印stackoverflow文件中第一个和最后一个匹配的行数.和
awk -v f=$first -v l=$last 'NR>=f && NR<=l' your_file打印从$first行号到$last行号的所有行.$ cat a
here we
have some text
stackoverflow
and other things
bla
bla
bla bla
stackoverflow
and whatever else
stackoverflow
to make more fun
blablabla
$ read first last <<< $(grep -n stackoverflow a | awk -F: 'NR==1 {printf "%d ", $1}; END{print $1}')
$ awk -v f=$first -v l=$last 'NR>=f && NR<=l' a
stackoverflow
and other things
bla
bla
bla bla
stackoverflow
and whatever else
stackoverflow
Run Code Online (Sandbox Code Playgroud)
按步骤:
$ grep -n stackoverflow a
3:stackoverflow
9:stackoverflow
11:stackoverflow
$ grep -n stackoverflow a | awk -F: 'NR==1 {printf "%d ", $1}; END{print $1}'
3 11
$ read first last <<< $(grep -n stackoverflow a | awk -F: 'NR==1 {printf "%d ", $1}; END{print $1}')
$ echo "first=$first, last=$last"
first=3, last=11
Run Code Online (Sandbox Code Playgroud)
如果您知道可以有多少行的上限(例如,一百万行),那么您可以使用这个简单的滥用脚本:
(grep -A 100000 stackoverflow | grep -B 1000000 stackoverflow) < file
Run Code Online (Sandbox Code Playgroud)
您| tail -n +2 | head -n -1也可以附加以去除边框线:
(grep -A 100000 stackoverflow | grep -B 1000000 stackoverflow
| tail -n +2 | head -n -1) < file
Run Code Online (Sandbox Code Playgroud)