web-dev-qa-db-fra.com

Comment obtenir la dernière ligne non vide d'un fichier en utilisant tail dans Bash?

Comment obtenir la dernière ligne non vide en utilisant tail sous le shell Bash?

Par exemple, my_file.txt ressemble à ça:

bonjour
hola
Bonjour
(ligne vide)
(ligne vide)

Évidemment, si je le fais tail -n 1 my_file.txt J'obtiendrai une ligne vide. Dans mon cas, je veux obtenir bonjour. Comment je fais ça?

36
Debugger

Vous pouvez utiliser Awk:

awk '/./{line=$0} END{print line}' my_file.txt

Cette solution a l'avantage d'utiliser un seul outil.

27
Hai Vu

Utilisez tac pour ne pas avoir à lire le fichier entier:

tac FILE |egrep -m 1 .
34
Jürgen Hötzel

Que diriez-vous d'utiliser grep pour filtrer les lignes vides en premier?

$ cat rjh
1
2
3


$ grep "." rjh | tail -1
3
23
RichieHindle

Au lieu de tac, vous pouvez utiliser tail -r si disponible.

tail -r | grep -m 1 '.'
6
kalu

si vous voulez omettre les espaces blancs, c'est-à-dire les espaces/tabulations à la fin de la ligne, pas seulement les lignes vides

awk 'NF{p=$0}END{print p}' file
3
ghostdog74

Si tail -r n'est pas disponible et vous n'avez pas egrep, ce qui suit fonctionne bien:

tac $FILE | grep -m 1 '.'

Comme vous pouvez le voir, c'est une combinaison de deux des réponses précédentes.

1
Andy Forceno

Imprimez la dernière ligne visuellement non vide:

tac my_file.txt | grep -vm 1 '^[[:space:]]*$'

ou

awk 'BEGIN{RS="\r?\n[[:space:]]*"}END{print}' my_file.txt

Le \r? est probablement nécessaire pour les fichiers texte DOS/Windows. Classes de caractères telles que [:space:] fonctionne avec GNU versions de awk (c'est-à-dire gawk) et grep au moins. Avec d'autres implémentations, vous devez énumérer l'espace caractères manuellement dans le code, c'est-à-dire remplacer [:space:] par \t \n\f\r\v. Je ne sais pas quelle serait la bonne façon de gérer les caractères de retour arrière (\b) dans le fichier.

Ce qui suit ne fonctionne qu'avec [:space:]:

tac my_file.txt | grep -m 1 '[^[:space:]]'
0
jarno