C'est simple, court et facile à écrire, à comprendre et à vérifier, et je l'aime personnellement:
grep -oE '\S+$' file
grep
dans Ubuntu , lorsqu'il est invoqué avec -E
ou -P
, prend le raccourci \s
pour signifier un caractère d'espace blanc (en pratique, généralement un espace ou une tabulation) et \S
pour signifier tout ce qui n'en est pas un. En utilisant le quantificateur+
et l'ancre de fin de ligne$
, le motif \S+$
correspond à un ou plusieurs espaces non à la fin d'une ligne . Vous pouvez utiliser à la -P
place de -E
; dans ce cas, la signification est la même, mais un moteur d'expressions régulières différent est utilisé, de sorte qu'elles peuvent avoir des caractéristiques de performances différentes .
C'est équivalent à la solution commentée d'Avinash Raj (juste avec une syntaxe plus simple et plus compacte):
grep -o '[^[:space:]]\+$' file
Ces approches ne fonctionneront pas s'il peut y avoir des espaces de fin après le nombre. Ils peuvent être modifiés comme ils le font, mais je ne vois aucun intérêt à y entrer ici. Bien qu'il soit parfois instructif de généraliser une solution pour travailler dans plus de cas, il n'est pas pratique de le faire presque aussi souvent que les gens ont tendance à le supposer, car on n'a généralement aucun moyen de savoir de quelles manières incompatibles différentes le problème pourrait finalement avoir à résoudre. être généralisé.
La performance est parfois une considération importante. Cette question ne stipule pas que l'entrée est très grande, et il est probable que chaque méthode qui a été publiée ici est assez rapide. Cependant, si la vitesse est souhaitée, voici un petit point de repère sur un fichier d'entrée de dix millions de lignes:
$ perl -e 'print((<>) x 2000000)' file > bigfile
$ du -sh bigfile
439M bigfile
$ wc -l bigfile
10000000 bigfile
$ TIMEFORMAT=%R
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
819.565
$ time grep -oE '\S+$' bigfile > bigfile.out
816.910
$ time grep -oP '\S+$' bigfile > bigfile.out
67.465
$ time cut -d= -f2 bigfile > bigfile.out
3.902
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
815.183
$ time grep -oE '\S+$' bigfile > bigfile.out
824.546
$ time grep -oP '\S+$' bigfile > bigfile.out
68.692
$ time cut -d= -f2 bigfile > bigfile.out
4.135
Je l'ai exécuté deux fois au cas où l'ordre importait (comme c'est parfois le cas pour les tâches lourdes d'E / S) et parce que je n'avais pas de machine disponible qui ne faisait pas d'autres choses en arrière-plan qui pourraient fausser les résultats. De ces résultats, je conclus ce qui suit, au moins provisoirement et pour les fichiers d'entrée de la taille que j'ai utilisée:
Hou la la! Passer -P
(pour utiliser PCRE ) plutôt que -G
(par défaut quand aucun dialecte n'est spécifié) ou -E
rendu grep
plus rapide de plus d'un ordre de grandeur. Ainsi, pour les fichiers volumineux, il peut être préférable d'utiliser cette commande que celle illustrée ci-dessus:
grep -oP '\S+$' file
SENSATIONNEL!! La cut
méthode dans la réponse de αғsнιη , est sur un ordre de grandeur plus rapide que même la version plus rapide de mon chemin! C'était également le gagnant du benchmark pa4080 , qui couvrait plus de méthodes que cela mais avec une entrée plus petite - et c'est pourquoi je l'ai choisi, parmi toutes les autres méthodes, à inclure dans mon test. Si les performances sont importantes ou si les fichiers sont énormes, je pense que la méthode de αғsнιη devrait être utilisée.cut -d= -f2 file
cut
Cela sert également à rappeler que le simple cut
et les paste
utilitaires ne doivent pas être oubliés , et devraient peut-être être préférés le cas échéant, même s'il existe des outils plus sophistiqués comme grep
celui-ci sont souvent proposés en tant que solutions de première ligne (et que je suis personnellement plus habitué à utiliser).
grep -o '[^[:space:]]\+$' file