如何匹配行开头的文本并打印前 X 行以及匹配的行?

pha*_*aft 2 shell text-processing text

我在这里发现了类似的问题,但这并不完全是我想要的。

假设我有一个像这样的文本文件:

[...]

age: 10
country: United States
city: New York
name: John

age: 27
country: Canada
city: Toronto
name: Robert

age: 32
country: Mexico
city: Guadalajara
name: Pedro

[...]
Run Code Online (Sandbox Code Playgroud)

我想匹配以“name: Robert”开头的行,并打印前 3 行以及匹配的结果,只得到这些行:

age: 27
country: Canada
city: Toronto
name: Robert
Run Code Online (Sandbox Code Playgroud)

我如何在终端中执行此操作?

sse*_*taH 11

使用grep

$ grep -B3 '^name: Robert$' input_file
age: 27
country: Canada
city: Toronto
name: Robert
Run Code Online (Sandbox Code Playgroud)


ter*_*don 6

您已经有了最好的方法,只需使用grep -B,但您也可以在“段落模式”下使用 perl 。此模式由开关启用-00,意味着“行”现在由两个连续的换行符定义,基本上是一个段落。这可以让您执行以下操作:

$ perl -00 -ne 'print if /name: Robert\b/' file
age: 27
country: Canada
city: Toronto
name: Robert

$
Run Code Online (Sandbox Code Playgroud)

awk您还可以通过将记录分隔符 ( RS) 设置为空 ( '')来执行相同的操作:

$ awk -v RS='' '/name: Robert$/' file
age: 27
country: Canada
city: Toronto
name: Robert
$
Run Code Online (Sandbox Code Playgroud)

awk 的另一个优点是不会像 perl 那样打印额外的换行符。