67 votes

Opposé à queue : toutes les lignes sauf les n dernières lignes

Comment puis-je éliminer les n dernières lignes d'un fichier avec un filtre de ligne de commande unix ?

Ce serait en quelque sorte le contraire de tail : tail rejette les n premières lignes mais fait passer le reste, mais je veux que la commande fasse passer tout ce qu'il y a à faire sauf les n dernières lignes.

Malheureusement, je n'ai rien trouvé de tel - head n'aide pas non plus. EDITAR : Au moins dans Solaris, il ne prend pas d'arguments négatifs.

Mise à jour : Je suis surtout intéressé par une solution qui fonctionne pour les gros fichiers, c'est-à-dire les fichiers journaux, où vous pourriez vouloir inspecter ce qui s'est passé sauf dans les dernières minutes.

72voto

Si vous avez GNU head vous pouvez utiliser

head -n -5 file.txt

pour imprimer tout sauf les 5 dernières lignes de file.txt .

Si head -n ne prend pas d'arguments négatifs, essaie

head -n $(( $(wc -l file.txt | awk '{print $1}') - 5 )) file.txt

29voto

Kjetil S. Points 479
head file.txt               # first 10 lines
tail file.txt               # last 10 lines
head -n 20 file.txt         # first 20 lines
tail -n 20 file.txt         # last 20 lines
head -20 file.txt           # first 20 lines
tail -20 file.txt           # last 20 lines
head -n -5 file.txt         # all lines except the 5 last
tail -n +5 file.txt         # all lines except the 4 first, starts at line 5

12voto

jwd Points 3222

Voici un moyen simple de supprimer la dernière ligne, qui fonctionne sous BSD, etc.

sed '$d' input.txt

L'expression dit "à la dernière ligne, supprimer". Les autres lignes seront imprimées, car il s'agit de sed Le comportement par défaut de l'entreprise.

Vous pouvez les enchaîner pour supprimer plusieurs lignes

sed '$d' input.txt | sed '$d' | sed '$d'

Ce qui est un peu lourd, certes, mais ne fait qu'un seul balayage du dossier.

Vous pouvez également jeter un coup d'œil à ceci, pour plus de réponses : https://stackoverflow.com/questions/13380607/how-to-use-sed-to-remove-last-n-lines-of-a-file

Voici une phrase adaptée de l'une de mes préférées là-bas :

count=10
sed -n -e ':a' -e "1,$count"'!{P;N;D;};N;ba'

Je me suis amusé à le déchiffrer, et j'espère que vous aussi ( ) : Il fait buffer count lignes au fur et à mesure qu'il scanne, mais sinon il est assez efficace.

Remarque : le ! est cité en utilisant des guillemets simples pour éviter qu'il soit interprété par Bash (si c'est votre Shell). Des guillemets simples autour de l'ensemble fonctionnent pour sh et peut-être d'autres.

8voto

MikeL Points 181

Sur MAC la solution d'obtenir toutes les lignes sauf les N dernières lignes :

head -n -5 file.txt

ne fonctionnera pas car vous obtiendrez l'erreur suivante :

head: illegal line count -- -5

Une des solutions consiste à installer coreutils et à exécuter ghead :

brew install coreutils
ghead -n -5 file.txt

Les utilitaires de base GNU ou coreutils sont un paquetage de logiciels GNU contenant des réimplémentations pour de nombreuses applications de base. contenant des réimplémentations de nombreux outils de base, tels que cat, ls, et rm, qui sont utilisés sur les systèmes d'exploitation de type Unix.

4voto

techgirl Points 31

Je suis curieux de savoir pourquoi vous pensez head n'est pas une option :

~$ man head
...
-n, --lines=[-]K
        print the first K lines instead of the first 10; 
        with the leading `-', print all but the last K lines of each file

Cela semble correspondre à votre objectif, en utilisant, par exemple :

head -n -20 yourfile.txt

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X