web-dev-qa-db-fra.com

Lignes de fichier de sortie de la dernière à la première dans Bash

Je veux afficher les 10 dernières lignes de mon fichier journal, en commençant par la dernière ligne - comme un lecteur de journal normal. Je pensais que ce serait une variation de la commande tail, mais je ne trouve cela nulle part.

34
Yarin

J'ai fini par utiliser tail -r, qui fonctionnait sur mon OSX (tac ne fonctionne pas)

tail -r -n10
8
Yarin

GNU (Linux) tilise les éléments suivants :

tail -n 10 <logfile> | tac

tail -n 10 <logfile> affiche les 10 dernières lignes du fichier journal et tac (chat orthographié à l'envers) inverse l'ordre.

BSD (OS X) de tail utilise le -r option:

tail -r -n 10 <logfile>

Dans les deux cas , vous pouvez essayer ce qui suit:

if hash tac 2>/dev/null; then tail -n 10 <logfile> | tac; else tail -n 10 -r <logfile>; fi

REMARQUE: Le Le manuel GNU indique que le BSD -r option "ne peut inverser que les fichiers qui sont au plus aussi gros que son tampon, qui est généralement de 32 Ko" et que tac est plus fiable. Si la taille de la mémoire tampon est un problème et que vous ne pouvez pas utiliser tac, vous pouvez envisager d'utiliser réponse de @ ata qui écrit la fonctionnalité dans bash.

49
Rick Smith

tac fait ce que vous voulez. C'est l'inverse de cat.

tail -10 logfile | tac

13
drysdam

Vous pouvez le faire avec du bash pur:

#!/bin/bash
readarray file
lines=$(( ${#file[@]} - 1 ))
for (( line=$lines, i=${1:-$lines}; (( line >= 0 && i > 0 )); line--, i-- )); do
    echo -ne "${file[$line]}"
done

./tailtac 10 <unfichier

./tailtac -10 <unfichier

./tailtac 100000 <unfichier

./tailtac <unfichier

2
ata

Ce sont les méthodes parfaites pour imprimer la sortie dans l'ordre inverse

tail -n 10 <logfile>  | tac
2