Contenir un file pour un text spécifique

Existe-t-il une command Linux similaire à tail où, au lieu de spécifier un nombre de lignes, vous pouvez spécifier une string de text, searchr le text de la dernière ligne à la première, puis afficher toutes les lignes ? Le contenu à la fin du journal que j'essaie de capturer peut varier entre 0 et 10 lignes, alors quand ce n'est pas 10, le file journal que je copy est difficile à comprendre.

A partir de la page man tail, je ne vois que la possibilité de spécifier des lignes ou des octets.

spécifiez une string de text, puis affichez toutes les lignes après cela

Voici quelques fausses données à lire:

$ seq 100 > input 

… et là je cherche la string "90" et affiche tout après (jusqu'au bout du file):

 $ sed -n '/90/,$p' input 90 91 92 93 94 95 96 97 98 99 100 

Si vous voulez une solution plus flexible, utilisez une variable, changez les quotes sed (et échappez le $ du shell, pour sed):

 $ t=96 $ sed -n "/$t/,\$p" input # or $ sed -n /$t/,\$p input 96 97 98 99 100 

Vous pouvez utiliser cette command au retail : https://github.com/mwh/retail

Il prend en charge les expressions régulières pour démarrer et arrêter la sortie, vous voulez donc probablement quelque chose comme:

 retail -r STARTPATTERN mylogfile retail -r STARTPATTERN -u ENDPATTERN -f mylogfile 

L'option -r trouve explicitement la dernière instance du pattern, ce qui est généralement ce que vous voulez.

Voir aussi: https://superuser.com/questions/270529/monitoring-a-file-until-a-ssortingng-is-found

Voici un exemple en utilisant un journal d'erreur Apache où Apache a été redémarré plusieurs fois, en utilisant la retail au retail pour extraire juste le redémarrage final:

 $ grep -c "Apache.*resuming normal operations" /var/web/logs/error.log 8 $ retail -r "Apache.*resuming normal operations" /var/web/logs/error.log [Wed Jul 6 17:12:55.534567 2016] [mpm_prefork:notice] [pid 17965] AH00163: Apache/2.4.4 (Unix) OpenSSL/1.0.1e configured -- resuming normal operations [Wed Jul 6 17:12:55.534582 2016] [mpm_prefork:info] [pid 17965] AH00164: Server built: Mar 26 2016 12:22:17 [Wed Jul 6 17:12:55.534598 2016] [core:notice] [pid 17965] AH00094: Command line: '/usr/local/apache2/bin/httpd' 

Ou vous pouvez utiliser une regex de "(SIGTERM.* shutting down|SIGHUP.*restart)" pour tout afficher après la dernière tentative d'arrêt ou de redémarrage.

Si votre grep possède l' -A pour afficher un certain nombre de lignes de context après chaque correspondance, vous pouvez effectuer les opérations suivantes:

 grep -A 10 'pattern' logfile | less 

L'éditeur ed a la possibilité de searchr en arrière une occurrence précédente d'une expression régulière – et règle commodément son adresse actuelle à la dernière ligne du file lors de l'ouverture. Donc tu pourrais faire

 ed file ?ssortingng?,.p q 

pour sortir des lignes de la dernière occurrence de ssortingng à la fin du file (inclus) – ou, en tant que doubleur

 printf '?ssortingng?,.p\nq' | ed -s file 

Juste pour être complet, je vais jeter une solution en utilisant awk – alors que vous n'en avez pas besoin pour cette tâche spécifique, c'est un outil très puissant et c'est le genre de problème qu'il est bon de résoudre.

 awk '/pattern/{x=1}x{print}' 

Cela définit la variable x lorsque le model est trouvé et imprime une ligne chaque fois que x est vrai. Notez que cela commence à partir de la première occurrence du motif.