Halte es einfach - Schwanz
Wir sollten keinen regulären Ausdruck oder mehr als einen Prozess benötigen, nur um Zeichen zu zählen.
Der Befehl tail, der häufig zum Anzeigen der letzten Zeilen einer Datei verwendet wird, verfügt über eine option -c( --bytes), die genau das richtige Werkzeug dafür zu sein scheint:
$ printf 123456789 | tail -c 3
789
(Wenn Sie sich in einer Shell befinden, ist es sinnvoll, eine Methode wie in der Antwort von mikeserv zu verwenden, da dies das Starten des Prozesses für spart tail.)
Echte Unicode-Zeichen?
Nun fragen Sie nach den letzten drei Zeichen . Das gibt Ihnen diese Antwort nicht: Sie gibt die letzten drei Bytes aus !
Solange jedes Zeichen ein Byte ist, tail -cfunktioniert es einfach. So ist es verwendet werden kann , wenn der Zeichensatz ist ASCII, ISO 8859-1oder eine Variante.
Wenn Sie eine Unicode-Eingabe haben, wie im allgemeinen UTF-8Format, ist das Ergebnis falsch:
$ printf 123αβγ | tail -c 3
�γ
In diesem Beispiel sind UTF-8die griechischen Zeichen alpha, beta und gamma mit zwei Bytes lang:
$ printf 123αβγ | wc -c
9
Die Option -mkann mindestens die echten Unicode-Zeichen zählen:
printf 123αβγ | wc -m
6
Ok, die letzten 6 Bytes geben uns die letzten 3 Zeichen:
$ printf 123αβγ | tail -c 6
αβγ
So tailbietet keine Unterstützung für allgemeine Zeichen Handhabung und versucht es nicht einmal (siehe unten): Es behandelt variabler Größe Linien, aber keine variable Größe Zeichen.
Sagen wir es so: Es tailist genau richtig für die Struktur des Problems, aber falsch für die Art der Daten.
GNU coreutils
Suchen Sie weiter, es stellt sich heraus, der dich GNU coreutils, die Sammlung von grundlegenden Werkzeuge wie sed, ls, tailund cutist noch nicht vollständig internationalisiert. Dabei geht es hauptsächlich um die Unterstützung von Unicode.
Wäre zum Beispiel cutein guter Kandidat, um hier zur Charakterunterstützung anstelle von Tail zu verwenden. Es gibt Optionen zum Bearbeiten von Bytes oder Zeichen -c( --bytes) und -m( --chars);
Nur das -m/ --charsist ab Version
cut (GNU coreutils) 8.212013
nicht implementiert!
Von info cut:
`-c CHARACTER-LIST'
`--characters=CHARACTER-LIST'
Select for printing only the characters in positions listed in CHARACTER-LIST.
The same as `-b' for now, but internationalization will change that.
Siehe auch diese Antwort zu Kann nicht `cut -c` (` --characters`) mit UTF-8 verwendet werden? .
grep -o '.\{3\}$'