Domine o comando `tail` no Linux: Tutorial completo com exemplos práticos

O comando tail no Linux é utilizado para exibir dados a partir do final de um arquivo. Ele possui a capacidade de mostrar as atualizações que são adicionadas a um arquivo em tempo real. Exploraremos como utilizar este comando.

O tail perdeu a sua utilidade com o systemd?

O tail tem a função de apresentar o conteúdo que se encontra no final de um arquivo. Em geral, novos dados são anexados ao final, tornando o tail uma ferramenta prática para visualizar as informações mais recentes. Além disso, o tail pode monitorar um arquivo, mostrando cada nova linha de texto conforme elas são registradas, o que o torna ideal para acompanhar arquivos de log.

Grande parte das distribuições Linux atuais implementaram o sistema systemd como gestor de serviços. Este é o primeiro processo a ser executado, possui o ID de processo 1, e é o processo “pai” de todos os outros. Previamente, esta tarefa era gerenciada pelo sistema init.

Esta alteração trouxe um novo padrão para os arquivos de log do sistema. Em vez de texto simples, o systemd os armazena em formato binário. Para visualizar esses logs, é necessário usar o utilitário journalctl. Como o tail funciona apenas com arquivos de texto, o tail tornou-se obsoleto? Ele ainda tem alguma utilidade?

O tail oferece mais do que apenas a exibição de atualizações em tempo real. Muitos arquivos de log, gerados por aplicações, por exemplo, ainda são criados em texto simples, mantendo o tail relevante.

Como usar o tail

Ao executar tail seguido do nome de um arquivo, as últimas dez linhas desse arquivo serão exibidas. Os arquivos de exemplo usados aqui contêm listas de palavras organizadas, com cada linha numerada, facilitando a compreensão dos exemplos e o efeito das diferentes opções.

tail word-list.txt

Para exibir um número diferente de linhas, utilize a opção -n (número de linhas):

tail -n 15 word-list.txt

É possível omitir o -n, usando apenas um hífen “-” seguido do número desejado. Certifique-se de que não haja espaços entre eles. Embora esta seja uma forma de comando considerada obsoleta, ela ainda consta na página man e funciona normalmente.

tail -12 word-list.txt

Utilizando tail com múltiplos arquivos

O tail pode operar sobre múltiplos arquivos simultaneamente. Basta incluir os nomes dos arquivos na linha de comando:

tail -n 4 list-1.txt list-2.txt list-3.txt

Um pequeno cabeçalho é exibido para cada arquivo, indicando a qual arquivo as linhas pertencem.

Exibindo linhas a partir do início de um arquivo

O modificador + (contagem a partir do início) instrui o tail a mostrar linhas desde o começo de um arquivo, a partir de um número de linha específico. Se você escolher uma linha próxima ao início de um arquivo longo, a saída pode ser extensa. Nesse caso, é recomendável usar um pipe com o comando less para paginar a saída.

tail +440 list-1.txt

Dessa forma, você pode navegar pelo texto de forma controlada.

Como este arquivo tem 20.445 linhas, este comando é equivalente a usar a opção -6:

tail +20440 list-1.txt

Usando bytes com tail

Você pode instruir o tail a usar deslocamentos em bytes em vez de linhas usando a opção -c (bytes). Isso é útil quando você tem um arquivo de texto formatado em registros de tamanho fixo. Um caractere de nova linha conta como um byte. Este comando exibirá os últimos 93 bytes do arquivo:

tail -c 93 list-2.txt

Você pode combinar a opção -c (bytes) com o modificador + (contagem a partir do início do arquivo) e especificar um deslocamento em bytes contados a partir do início do arquivo:

tail -c +351053 list-e.txt

Redirecionando a saída para tail

Anteriormente, redirecionamos a saída do tail para o comando less. Também podemos redirecionar a saída de outros comandos para o tail.

Para listar os cinco arquivos ou pastas com os horários de modificação mais antigos, use a opção -t (classificar por horário de modificação) com ls e redirecione a saída para o tail.

ls -tl | tail -5

O comando head mostra linhas de texto desde o início de um arquivo. Podemos combiná-lo com o tail para extrair uma seção de um arquivo. Aqui, usamos o head para extrair as primeiras 200 linhas de um arquivo. Essa saída é redirecionada para o tail, que extrai as últimas dez linhas. Assim, obtemos as linhas de 191 a 200, que são as últimas dez linhas das primeiras 200.

head -n 200 list-1.txt | tail -10

Este comando lista os cinco processos que mais consomem memória.

ps aux | sort -nk +4 | tail -5

Vamos analisar este comando:

O comando ps exibe informações sobre os processos em execução. As opções utilizadas são:

  • a: Lista todos os processos, não apenas os do usuário atual.
  • u: Exibe uma saída orientada ao usuário.
  • x: Lista todos os processos, incluindo aqueles que não estão sendo executados em um TTY.

O comando sort organiza a saída do comando ps. As opções usadas com sort são:

  • n: Ordena numericamente.
  • k +4: Ordena pela quarta coluna.

O comando tail -5 exibe os últimos cinco processos da saída ordenada. Estes são os cinco processos que mais consomem memória.

Usando o tail para monitorar arquivos em tempo real

O monitoramento de novas entradas de texto em um arquivo, geralmente um arquivo de log, é fácil com o tail. Insira o nome do arquivo na linha de comando e use a opção -f (seguir).

tail -f geek-1.log

Conforme novas entradas de log são adicionadas ao arquivo, o tail atualiza a exibição na janela do terminal.

Você pode refinar a saída para incluir apenas linhas de particular relevância. Aqui, usamos o grep para exibir somente as linhas que contêm a palavra “média”:

tail -f geek-1.log | grep average

Para acompanhar as alterações em dois ou mais arquivos, insira os nomes dos arquivos na linha de comando:

tail -f -n 5 geek-1.log geek-2.log

Cada entrada é marcada com um cabeçalho, indicando de qual arquivo o texto veio.

A exibição é atualizada sempre que uma nova entrada chega a um arquivo monitorado. Para definir o intervalo de atualização, utilize a opção -s (intervalo de suspensão). Isso instrui o tail a esperar alguns segundos, cinco neste exemplo, entre as verificações do arquivo.

tail -f -s 5 geek-1.log

Embora não seja perceptível em uma captura de tela, as atualizações no arquivo ocorrem a cada dois segundos, e as novas entradas são exibidas no terminal a cada cinco segundos.

Ao monitorar entradas em vários arquivos, é possível ocultar os cabeçalhos que indicam a origem de cada linha. Use a opção -q (silencioso) para isso:

tail -f -q geek-1.log geek-2.log

A saída dos arquivos é exibida de forma contínua, sem nenhuma indicação de qual arquivo de log cada entrada se originou.

O tail ainda é relevante

Mesmo com o acesso aos arquivos de log do sistema sendo feito pelo journalctl, o tail continua sendo uma ferramenta útil, principalmente quando usado em conjunto com outros comandos, seja como entrada ou saída.

O systemd pode ter mudado o cenário, mas ainda há espaço para utilitários tradicionais que seguem a filosofia Unix de fazer uma coisa e fazê-la bem.