unix命令从单词的第一个和最后一个出现之间获取行并写入文件

Kri*_*hna 7 unix bash shell grep

我想要一个unix命令来查找单词的第一个和最后一个出现之间的行

例如:

让我们想象我们有1000行.第十行包含单词"stackoverflow",第三十五行也包含单词"stackoverflow".

我想打印10到35之间的行并将其写入新文件.

fed*_*qui 9

你可以分两步完成.基本思路是:

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:output
  • awk -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)


Alf*_*lfe 1

如果您知道可以有多少行的上限(例如,一百万行),那么您可以使用这个简单的滥用脚本:

(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)