(5 respuestas)
Cerrado hace 2 años.
Tengo un archivo que contiene varias apariciones del patrón “====” . Estos patrones son seguidos por textos. Me gustaría buscar la última aparición de “====” patrón e imprima todas las líneas después del patrón. ¿Alguna idea sobre cómo hacerlo en bash? Combinación de grep
, awk
, sed
o tail
, etc.?
Archivo de muestra:
====
First run of script
End of first Script
====
2nd run of script
End of 2nd script
====
3rd run of script
End of 3rd script
La salida del comando debería verse como a continuación.
3rd run of script
End of 3rd script
Respuesta aceptada:
Método de herramientas de software, más eficiente para archivos grandes, ya que solo lee el final del archivo y luego se detiene cuando encuentra la última coincidencia:
tac sample.txt | grep -F -m1 -B 999999 '====' | head -n -1 | tac
Nota:aumente o reduzca 999999
según sea necesario, solo para que sea más larga que cualquier coincidencia posible. Este código funcionaría mejor si se supiera de antemano que la última coincidencia está cerca del final de un archivo grande. Véase también Glenn Jackman La respuesta de con variantes para awk
y sed
que evitan la necesidad de 999999
. Para sistemas con muy pocos recursos, grep
es más eficiente que awk
o sed
.
Para evitar adivinar, algunos agregaron stat
la fealdad funcionaría:
f=sample.txt; tac "$f" | grep -F -m1 -B $(stat -c '%s' "$f") '====' |
head -n -1 | tac