Mantê-lo simples - cauda
Não devemos precisar de uma expressão regular ou mais de um processo apenas para contar caracteres.
O comando tail , geralmente usado para mostrar as últimas linhas de um arquivo, tem uma opção -c ( --bytes ), que parece ser a ferramenta certa para isso:
$ printf 123456789 | tail -c 3
789
(Quando você está em um shell, faz sentido usar um método como na resposta do mikeserv, porque ele salva o início do processo para tail .)
Caracteres Unicode reais?
Agora, você pergunta pelos três últimos caracteres ; Não é isso que esta resposta lhe dá: ela produz os três últimos bytes !
Desde que cada caractere seja um byte, tail -c apenas funciona. Por isso, pode ser usado se o conjunto de caracteres for ASCII , ISO 8859-1 ou uma variante.
Se você tiver uma entrada em Unicode, como no formato comum UTF-8 , o resultado está errado:
$ printf 123αβγ | tail -c 3
�γ
Neste exemplo, usando UTF-8 , os caracteres grego alfa, beta e gama têm dois bytes de comprimento:
$ printf 123αβγ | wc -c
9
A opção -m pode pelo menos contar os caracteres reais do unicode:
printf 123αβγ | wc -m
6
Ok, os últimos 6 bytes nos fornecerão os 3 últimos caracteres:
$ printf 123αβγ | tail -c 6
αβγ
Portanto, tail não suporta o tratamento de caracteres gerais e nem mesmo tenta (veja abaixo): Ele lida com linhas de tamanho variável, mas sem caracteres de tamanho variável.
Vamos colocar desta forma: tail é o ideal para a estrutura do problema a ser resolvido, mas errado para o tipo de dados.
GNU coreutils
Olhando mais adiante, verifica-se que o GNU coreutils, a coleção de ferramentas básicas como sed , ls , tail e cut , ainda não está totalmente internacionalizada. Qual é principalmente sobre o suporte a Unicode.
Por exemplo, cut seria um bom candidato para usar em vez de cauda aqui para suporte de caracteres; Ele tem opções para trabalhar em bytes ou caracteres, -c ( --bytes ) e -m ( --chars );
Só que -m / --chars é, a partir da versão
cut (GNU coreutils) 8.21 , 2013,
não implementado!
De 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.
Veja também esta resposta para .