Você também pode usar uma das seguintes opções
tac ./test | grep -B $(cat ./test | wc -l) -m 1 'pattern'|tac
ou
tac ./test |head -n $(tac ./test | grep -n 'pattern' | cut -d: -f1 | head -n 1)|tac
ou
tac ./test |sed ':a;N;$!ba;s/\n/'"pattern"'/g' | sed 's/'"patternpattern"'/\n/g'|head -n 1|sed 's/'"pattern"'/\n/g'|tac
A primeira opção é muito semelhante ao que o OP sugeriu apenas certifica-se de mostrar linhas suficientes antes do contexto contando as linhas no arquivo
A segunda opção procura o número da linha da primeira partida (você pode mudar isso também mudando a 'cabeça' interna) e então usa a cabeça naquele número
A última opção substitui todas as novas linhas pela correspondência e substitui duas correspondências adjacentes por uma nova. A saída disso é uma linha para cada bloco de texto entre duas correspondências. Depois disso, ele usa 'head' para escolher a primeira linha (convertendo o bloco de texto até a primeira partida) e então traduz cada partida para uma nova linha. esta opção só funciona se o arquivo estiver no seguinte formato
pattern
texttexttext
texttexttext texttexttext
texttexttexttexttexttexttexttexttext
pattern
texttexttext
pattern
texttexttext
texttexttexttexttexttexttexttexttext
e assim por diante