如何在每次 grep 匹配后显示行,直到其他特定匹配?

B F*_*ley 63 grep

我知道通过使用"-A NUM"开关,我可以在每次匹配后打印特定数量的尾随行。我只是想知道是否可以打印尾随行,直到在每次匹配后找到特定单词为止。例如,当我搜索“Word A”时,我想查看包含“Word A”的行以及它之后的行,直到包含“Word D”的行。

语境:

Word A
Word B
Word C
Word D
Word E
Word F
Run Code Online (Sandbox Code Playgroud)

命令:

grep -A10 'Word A'
Run Code Online (Sandbox Code Playgroud)

我需要这个输出:

Word A
Word B
Word C
Word D
Run Code Online (Sandbox Code Playgroud)

sae*_*edn 100

似乎您想打印 ' Word A' 和 ' Word D' (含)之间的行。我建议你使用sed而不是grep. 它允许您编辑一系列以您想要的模式开始和结束的输入流。您应该告诉sed打印范围内的所有行,而不是其他行:

sed -n -e '/Word A/,/Word D/ p' file
Run Code Online (Sandbox Code Playgroud)

  • @2rs2ts 使其独占,只需添加`| sed -e '1d;$d'`,即删除第一行和最后一行 (7认同)
  • 如果您想排除之间的所有行——也就是说,您只想查看两个匹配项之外的行——那么:`sed -n -e '/pattern A/,/pattern D/d; p'` 这表示,“从模式 A 到模式 D 中删除并打印其他所有内容”。不幸的是,这场比赛是贪婪的。这意味着如果模式 A 和 D 出现多次,您将从*第一个*模式A匹配到*最后*模式D。如果是这种情况,恐怕Perl或Python是您的朋友。 (2认同)
  • 如何使用模式内的 shell 变量实现这一点?不可能将变量嵌入由 // 包围的 awk/sed 模式中(因为它将内部的所有内容视为正则表达式)作为这个 [thread](https://unix.stackexchange.com/questions/120788/pass- shell-variable-as-a-pattern-to-awk)和[这个](/sf/ask/1335297001/脚本)确认。您需要另一种方法来获取 shell 变量的值。然而,这似乎也是在两个图案之间打印一系列线条的唯一方法。有人知道解决方案吗? (2认同)

小智 22

为什么不使用 awk ?

awk '/Word A/,/Word D/' filename
Run Code Online (Sandbox Code Playgroud)

  • 如果涉及大量文件,sed 似乎能够更有效地执行此操作。awk 可能更容易记住,但 sed 似乎值得在我的脑海中贴上一张便签。 (2认同)

小智 11

perl -lne 'print if /Word A/ .. /Word D/' file
Run Code Online (Sandbox Code Playgroud)

或者

cat file | perl -lne 'print if /Word A/ .. /Word D/'
Run Code Online (Sandbox Code Playgroud)

  • +1 来对抗驾车投反对票。我仍然会使用 `sed` 来实现此目的,除非您需要 Perl 正则表达式的强大功能来选择分隔行。 (2认同)