Con sed
usted puede usar un rango y q
uit de entrada en una sola finalización:
sed '/^182$/p;//,/^ABC$/!d;/^ABC$/!d;q'
Del mismo modo con GNU grep
, puede dividir la entrada entre dos 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 el primero grep
encontró un -F
literal de cadena ixed, -x
la línea completa 182 coincide con 5 líneas desde el comienzo de su lectura, y el segundo encontró un ABC de tipo similar con 2 líneas desde el comienzo de su lectura, o 2 líneas después de la primera lectura de grep
dejar en la línea 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.
Usé un documento aquí en aras de una demostración reproducible, pero probablemente debería hacer:
{ grep ...; grep ...; } </path/to/log.file
También funcionará con otras construcciones de comandos compuestos de shell como:
for p in 182 ABC; do grep -nxFm1 "$p"; done </path/to/log.file
grep
se utiliza? No creo que esto se pueda hacer,grep
pero sería fácil conawk
osed
(solo o en combinación congrep
).grep
no es obligatorio. Todavía no estoy tan familiarizado consed
oawk
. Si tienes una buena solución, ¡déjame escucharla! :) @don_crissti solo se debe imprimir la primera línea. No me importan las otras ocurrencias.