Shell

如何匹配行首的文本並將前 X 行與匹配的行一起列印?

  • August 5, 2022

我在這裡發現了一個類似的問題,但這並不是我想要的。

假設我有一個這樣的文本文件:

[...]

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

[...]

我想匹配以“名稱:羅伯特”開頭的行,並列印前 3 行以及匹配的結果,只得到這些行:

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

我怎樣才能在終端中做到這一點?

使用grep

$ grep -B3 '^name: Robert$' input_file
age: 27
country: Canada
city: Toronto
name: Robert

您已經有了最好的方法,只需使用grep -B,但您也可以在“段落模式”中使用 perl。此模式由-00開關啟用,意味著“行”現在由兩個連續的換行符定義,基本上是一個段落。這使您可以執行以下操作:

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

$

您也可以awk通過將記錄分隔符 ( RS) 設置為空 ( '') 來執行相同的操作:

$ awk -v RS='' '/name: Robert$/' file
age: 27
country: Canada
city: Toronto
name: Robert
$

awk 還具有不列印 perl 所做的額外換行符的優點。

引用自:https://unix.stackexchange.com/questions/712454