打印两个匹配之间的特定行范围,从第一个匹配之后的特定行开始

打印两个匹配之间的特定行范围,从第一个匹配之后的特定行开始

如何打印两场比赛之间的所有数据,从第一场比赛后的特定行开始。例如,假设我有两个模式LinuxUnix并且这两个单词之间有条目,我想打印单词之后特定行的数据Linux,在下面的示例中,Linux 之后的第 6 行,直到单词Unix

Linux
12
32
34
556
676
77
85434
rdb
232323
232435656
Unix
98736
4345
4546456
456

预期输出:

85434
rdb
232323
232435656

我怎样才能使用 awk、sed 和 grep 来做到这一点?

答案1

每当你看到相对寻址时,你应该伸手去寻找ed

echo '/Linux/+7,/Unix/-1p' | ed -s input_file.txt -

或者,作为定理:

ed -s input_file.txt - <<\EOF
/Linux/+7,/Unix/-1p
EOF

答案2

尝试这个,

awk '/^Linux$/{flag=1;next}/^Unix$/{flag=0}flag' file | tail -n +7

或者没有tail

awk '/^Linux$/{flag=1;n=NR;next}/^Unix$/{flag=0};flag&&NR>(n+6);' file

解释:

  • 搜索pattern ^Linux$,如果找到,则设置flag为1(true)并直接移动到next行。
  • 继续下去,直到^Unix$找到模式并将其设置flag为 0(假)
  • 最后flag的 是 awk 特定符号。如果flag为 true,则打印该行,否则不执行任何操作。
  • flag只是一个变量名,可以是任何内容,例如fprintthisline

使用 Gnu sed

sed '/^Linux$/,/^Unix$/{//!b};d' file | tail -n +7

答案3

我会写其中之一

sed -n '/Linux/,/Unix/p' file | sed '1,7d;$d'
# or
awk '/Linux/ {nr = NR} /Unix/ {exit} nr && NR > nr+6' file

答案4

如果您搜索,grep您可以这样做:

  • grep -A 5 "string used to search" <path-to-file(s)>将显示匹配字符串后的 5 行
  • grep -B 5 "string used to search" <path-to-file(s)>将显示匹配字符串之前的 5 行
  • grep -C 5 "string used to search" <path-to-file(s)>将显示匹配字符串前后的 5 行(C 代表上下文)

对于你的例子,它将是: grep -A 2 -B 1 "rdb" <path-to-file(s)>

相关内容