(5 réponses)
Fermé il y a 2 ans.
J'ai un fichier qui contient plusieurs occurrences du modèle "====" . Ces motifs sont suivis de textes. Je souhaite rechercher la dernière occurrence de "====" motif et imprimez toutes les lignes après le motif. Des idées sur la façon de le faire en bash? Combinaison de grep
, awk
, sed
ou tail
, etc.?
Exemple de fichier :
====
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 sortie de la commande devrait ressembler à ci-dessous.
3rd run of script
End of 3rd script
Réponse acceptée :
Méthode des outils logiciels, plus efficace pour les gros fichiers puisqu'elle ne lit que la fin du fichier, puis s'arrête lorsqu'elle trouve la dernière correspondance :
tac sample.txt | grep -F -m1 -B 999999 '====' | head -n -1 | tac
Remarque :augmenter ou réduire 999999
au besoin, juste pour que ce soit plus long que n'importe quel match possible. Ce code fonctionnera mieux s'il est connu à l'avance que la dernière correspondance est connue pour être proche de la fin d'un fichier volumineux. Voir aussi Glenn Jackman la réponse avec des variantes pour awk
et sed
qui évitent le besoin de 999999
. Pour les systèmes avec très peu de ressources, grep
est plus efficace que awk
ou sed
.
Pour éviter de deviner, quelques stat
ajoutés la laideur fonctionnerait :
f=sample.txt; tac "$f" | grep -F -m1 -B $(stat -c '%s' "$f") '====' |
head -n -1 | tac