No artigo de hoje vamos ver alguns exemplos de uso do comando tr no linux, lembrando que o comando tr é um dos cobrados na prova LPI-101 (117-101) e por isso vale a pena entender bem seu funcionamento.
De acordo com o manual do comando tr (man tr) ele é utilizado para traduzir, comprimir e/ou deletar caracteres da entrada padrão (stdin) escrevendo o resultado na saída padrão (stdout). Ou seja, o comando tr no linux é utilizado para substituição de um valor por outro, basicamente especificamos o valor a procurar e o valor a substituir. Como o comando tr não trabalha com arquivos é necessário usar um pipe ou redirecionamento para que ele receba os valores. Abaixo a sintaxe básica do comando tr:
tr [OPTION]… SET1 [SET2]
Até aí tudo bem, mas vamos então ver alguns exemplos simples de como podemos utilizar o comando tr na prática.
Substituindo letras minúsculas por maiúsculas
Uma das primeiras formas de utilização que a maioria dos alunos aprendem é a substituição simples, por exemplo, para substituir letras minúsculas por maiúsculas. Veja abaixo algumas formas de se fazer isso com o comando tr no linux.
$ tr [:lower:] [:upper:] < alunos.txt > novo.txt
perceba que o comando acima está informando ao comando tr para substituir todos os caracteres minúsculos ([:lower:]) por maiúsculos ([:upper:]) do arquivo alunos.txt (< alunos.txt) e colocar o resultado dessa substituição no arquivo novo.txt (>novo.txt)
Ou ainda poderíamos utilizar na forma.
$ tr a-z A-Z < alunos.txt > novo.txt
Substituições Simples
Claro que com o comando tr também podemos fazer substituições simples, por exemplo, imagine que você tem um arquivo de uma base de dados qualquer e você precisa trocar todos os caracteres ! (exclamação) por * (asterisco)…não me perguntem por que, é só um exemplo (heheh). Você poderia utilizar o comando tr no linux na seguinte forma:
$ tr ! * < basedados.sql > novabase.sql
Trocar espaços por tab
Outra forma muito útil é poder trocar espaços em branco por tabs, por exemplo, você tem uma lista de itens separado por espaços em branco mas sua aplicação necessita que os itens sejam separados por tab. Veja como fazer isso com o comando tr de uma forma bem simples.
$ tr [:space:] ‘\t’ < minhalista > novalista
Eliminando caracteres repetidos
Esse eu já utilizei na prática, vária vezes…Imagine a seguinte situação, em um determinado website tem um formulário de cadastro de usuários para um determinado serviço ou seja lá o que for, onde os usuários irão preencher o nome em um formulário e isso será salvo em um banco de dados. Não sei por que alguns usuários gostam de pressionar a barra de espaço mais de uma vez entre o nome e o sobrenome, tipo João da Silva ao invés de simplesmente João da Silva. E por algum motivo você deseja eliminar esses espaços em branco a mais que foram cadastrados.
Para aqueles que não conhecem linux podem tentar da forma mais trabalhosa, por exemplo, em um editor de texto substituir 10 espaços por 1 espaço, depois 9 espaços por 1 espaço e assim vai…hahaha…felizmente o linux nos ajuda e muito nessas tarefas. Veja como é fácil fazer isso com o comando tr e sua opção -s (- -squeeze-repeats).
$ tr -s [:space:] ‘ ‘ < cadastro.sql > novocadastro.sql
perceba que utilizamos a opção -s e falamos para substituir espaços por um espaço simples (‘ ‘). Ou seja, dois segundos de trabalho.
Deletando caracteres
Outra exemplo de utilização do comando tr no linux seria para deletarmos algum caractere e para isso utilizamos a opção -d. Vamos mais uma vez imaginar um exemplo, você tem uma tabela no seu banco de dados com o CEP dos seus clientes. Todos os CEPs foram cadastrados no formato xx.xxx-xxx e agora você deseja manter o registro dos CEPs no formato xxxxxxxx, ou seja, sem o ponto (.) e sem o hifem (-). Veja como é fácil fazer isso com o comando tr.
$ tr -d ‘.-‘ < cep.sql
Transformando linhas em colunas
Agora vamos a um último exemplo, onde juntaremos algumas das opções que vimos aqui para realizar uma tarefa bem comum também. Vamos imaginar que você tenha um arquivo com uma lista de itens, com um item por linha, no formato abaixo.
$ cat item.txt
verde
amarelo
azul
branco
E agora você precisa criar um arquivo com esses itens em uma única linha, com a vírgula como separador. Veja abaixo uma das formas de executarmos essa tarefa com o comando tr no linux.
$ tr -s ‘\n’ ‘ ‘ < item.txt | tr [:blank:] ‘,’ > novalista.txt
Perceba que primeiro substituimos a quebra de linha (\n) por um espaço simples (‘ ‘) no arquivo item.txt. Depois, com o pipe redirecionamos o resultado para o comando seguinte, onde substituimos os espaços em branco horizontais ([:blank:]) por uma vírgula e por fim jogamos o resultado de tudo isso no arquivo novalista.txt.
Bem pessoal, por hora é isso aí. Como vocês viram o comando tr no linux pode facilitar nossa vida quando precisamos fazer algum tipo de substituição ou edição simples. Tarefas que muitas vezes poderiam ser demoradas, podem ser facilmente executadas em poucos segundos. Claro que existem diversas outras formas, algumas até mais poderosas, como por exemplo com o comando sed. Mas isso é assunto para um outro artigo… 😉
Por isso que eu sempre comento que aprender linux não é só para administradores de redes linux. O conhecimento básico de alguns recursos do linux pode facilitar a vida de qualquer um que utiliza a informática, seja você um estudante, webmaster que hospeda seus sites em servidores linux, ou um simples usuário doméstico. Com certeza, seja qual for o seu perfil, você vai conseguir encontrar recursos fantásticos no linux para otimizar seu dia a dia.
Acesse o curso “Linux Essentials” em nossa área premium.
Aprenda como dar seus primeiros passos no Linux e a dominar a linha de comandos (CLI).
Clique aqui para ativar o curso Linux Essentials!
Não é membro premium? Clique aqui e saiba mais sobre a DlteC Premium.
6 Responses
Obrigado pelas dicas esclarecedoras!
Pensei que o comando tr poderia ajudar, por isso fui ler o manual. No primeiro momento não entendi direito como usuá-lo, então achei um ótimo artigo aqui.
Assim como o exemplo de transformar linhas em colunas como faço ao contrário, isto é, linhas em colunas?
Muito bom, obrigado!
De nada!
Senhores. Bom dia, boa tarde ou boa noite.
Por favor poderiam esclarecer uma duvida?
A saída do meu comando:
echo -e `df -h` “” “\n” > `hostname`.txt; echo -e `nesta-nr` “\n” >> `hostname`.txt
Está saindo tudo o conteúdo do df e do netstat na mesma linha dentro do arquivo `hostname`.txt, por favor, como poderia resolver isso? Fazer a mesma saída do comando na tela, no arquivo?
Obrigado