Com sed
, você pode usar um intervalo e q
uit em uma única conclusão:
sed '/^182$/p;//,/^ABC$/!d;/^ABC$/!d;q'
Similarmente com GNU grep
você pode dividir a entrada entre dois grep
s:
{ grep -nxF -m1 182; grep -nxF -m1 ABC; } <<\IN
123
XXY
214
ABC
182
558
ABC
856
ABC
IN
... que imprime ...
5:182
2:ABC
... para indicar que o primeiro grep
encontrou um literal -F
ixed-string, -x
whole-line 182 correspondem a 5 linhas do o início de sua leitura, e o segundo encontrou uma correspondência ABC de 2 linhas desde o início de sua leitura - ou 2 linhas após a primeira grep
sai lendo na linha 5.
De man grep
:
-m NUM, --max-count=NUM
Stop reading a file after NUM matching
lines. If the input is standard input from
a regular file, and NUM matching lines are
output, grep ensures that the standard input
is positioned to just after the last
matching line before exiting, regardless of
the presence of trailing context lines.
This enables a calling process to resume a
search.
Eu usei um documento aqui para uma demonstração reproduzível, mas você provavelmente deveria fazer:
{ grep ...; grep ...; } </path/to/log.file
Ele também funcionará com outras construções de comando composto de shell, como:
for p in 182 ABC; do grep -nxFm1 "$p"; done </path/to/log.file