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?
Vous pouvez utiliser Awk:
awk '/./{line=$0} END{print line}' my_file.txt
Cette solution a l'avantage d'utiliser un seul outil.
Utilisez tac pour ne pas avoir à lire le fichier entier:
tac FILE |egrep -m 1 .
Que diriez-vous d'utiliser grep
pour filtrer les lignes vides en premier?
$ cat rjh
1
2
3
$ grep "." rjh | tail -1
3
Au lieu de tac
, vous pouvez utiliser tail -r
si disponible.
tail -r | grep -m 1 '.'
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
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.
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:]]'