- sort – Ordena um arquivo alfabeticamente
- uniq – Elimina linhas repetidas
- grep – Procura texto e expressões dentro de um arquivo
- paste – Combina arquivos em um só
- cut – Separa um arquivo por campos e imprime apenas partes especificadas
- tr – Transforma caracteres
- sed – Filtragem e Transformação de Conteúdo
sort – Ordena um arquivo alfabeticamente
Sintaxe: $ sort <arquivo>
Quando temos um arquivo com várias linhas, por exemplo, um arquivo de nomes de usuários, o sort pode servir para organizar este arquivo. Exemplo:
$ cat texto Kioshi Hugo Adriana Eitch Danilo $ sort texto Adriana Danilo Eitch Hugo Kioshi
Os nomes foram organizados e o resultado é jogado na tela. Ordenando o arquivo e escrevendo o resultado em outro arquivo:
$ sort texto > texto_organizado
Podemos também ordenar de forma inversa, com o parâmetro -r:
$ sort -r texto Kioshi Hugo Eitch Danilo Adriana
uniq – Elimina linhas repetidas
Sintaxe: $ uniq <arquivo>
Muitas vezes um arquivo de configuração tem várias linhas em branco, ou um arquivo texto tem várias linhas iguais que queremos eliminar. O uniq elimina as ocorrências de linhas repetidas, lembrando que as linhas iguais devem estar uma depois da outra para serem consideradas repetidas.
Exemplo:
$ cat texto Kioshi Hugo Hugo Adriana Eitch Danilo Kioshi Kioshi $ uniq texto Kioshi Hugo Adriana Eitch Danilo Kioshi
Note que apesar do uniq ter eliminado as linhas duplicadas (Hugo e Kioshi do final do arquivo), o comando mesmo assim deixou a palavra Kioshi duas vezes no arquivo, pois eles estão em diferentes localizações. Para resolver isto, combinamos com o sort:
$ sort texto | uniq Adriana Danilo Eitch Hugo Kioshi
Desta forma, o sort primeiro ordenou as linhas, deixando as repetidas uma depois da outra, fazendo com que o uniq eliminasse essas linhas duplicadas.
grep – Procura texto e expressões dentro de um arquivo
Sintaxe: $ grep <padrão> <arquivo1> [arquivo2] [arquivo3] ...
Quando temos arquivos com muitas informações, mas queremos apenas extrair algo bem específico do conteúdo, utilizamos o grep. Ele procura por algum texto (um padrão) dentro de arquivos, retornando a linha correspondente ao desejado.
Por exemplo, quero identificar se existe o nome Hugo no arquivo de palavras (dicionário) do sistema:
$ grep Hugo /usr/share/dict/words Hugo Hugo's
Por padrão, o grep diferencia maiúsculas e minúsculas, então se fizermos o comando anterior utilizando a palavra hugo em minúsculo, o grep não iria achar nada.
Para fazer uma pesquisa sem diferenciar maiúsculas de minúsculas, utilizamos o parâmetro -i:
$ grep -i ROOT /etc/passwd root:x:0:0:root:/root:/bin/bash
Mostramos que o usuário root existe no sistema, pois ele está no arquivo /etc/passwd.
Para identificar em que linha do arquivo o grep achou o texto, utilizamos o parâmetro -n:
$ grep -in servername /etc/httpd/conf/httpd.conf 130:ServerName www.devin.com.br
O grep achou, na linha 130, a palavra servername e imprimiu na tela toda a linha.
Podemos também especificar para o grep procurar recursivamente, ou seja, em um diretório e todos os seus arquivos e sub-diretórios, utilizando o parâmetro -r:
$ grep -ri backup /home/coletivo
Para inverter o que o grep mostra, ou seja, imprimir as linhas que não contém o texto, basta utilizar o parâmetro -v:
$ grep -v root /etc/passwd daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync ...corte...
O grep mostrou todas as linhas dos usuários do sistema, menos a do usuário root.
Também podemos usar expressões regulares para procurar certos padrões de texto em um arquivo. Por exemplo, mostrando todas as linhas de um arquivo que não começam com o caracter # (ou seja, linhas que não são comentários):
$ grep -v "^#" /etc/apache2/apache2.conf ServerRoot "/etc/apache2" LockFile /var/lock/apache2/accept.lock PidFile ${APACHE_PID_FILE} Timeout 300 KeepAlive On ...corte...
Se verificarmos o arquivo, veremos que além destas linhas, há uma série de comentários no arquivo, mas que não foram mostradas pelo grep.
paste – Combina arquivos em um só
Sintaxe: $ paste <arquivo1> <arquivo2> [arquivo3] ...
Com este comando podemos unir vários arquivos em um só, em formato de tabela, tornando o resultado algo parecido com uma planilha. Por exemplo, temos dois arquivos:
$ cat nomes Coletivo Digital Hugo Cisneiros (Eitch) Linux Tutorial $ cat enderecos [email protected] [email protected] www.kernel.org www.google.com.br
Juntando os dois arquivos com o paste:
$ paste nomes enderecos Coletivo Digital [email protected] Hugo Cisneiros (Eitch) [email protected] Linux www.kernel.org Tutorial www.google.com.br
O paste juntou as linhas, separando os campos com TAB.
cut – Separa um arquivo por campos e imprime apenas partes especificadas
Sintaxe: $ cut [opções] <arquivo1>
Bom para quando quisermos isolar partes de linhas de um arquivo de configuração ou de arquivos de dados tabulados. Basicamente, o parâmetro -d especifica o delimitador de campos e o -f indica qual campo imprimir como resultado. Exemplo:
$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh ...corte... $ cut -d ":" -f 1 /etc/passwd root daemon ...corte...
Utilizamos como delimitador o caracter “:” (dois pontos), que é o que separa os campos do arquivo de usuários do sistema /etc/passwd. Informamos também para o cut jogar como resultado apenas o campo de número um.
No parâmetro -f, podemos também especificar faixas de campos, ao invés de apenas um:
$ cut -d ":" -f 1,7 /etc/passwd root:/bin/bash daemon:/bin/sh ...corte...
Desta vez ele retornou os campos 1 e 7, que são respectivamente o usuário e a shell do usuário. Outro exemplo:
$ cut -d ":" -f 1-4,7 /etc/passwd root:x:0:0:/bin/bash daemon:x:1:1:/bin/sh ...corte...
Desta vez ele imprimiu os campos de 1 a 4 (1, 2, 3 e 4), depois o campo 7.
tr – Transforma caracteres
Sintaxe: $ tr <origem> <destino>
Transforma caracteres em outros caracteres (ou os remove). Com o tr conseguimos fazer essa substituição caracter por caracter, mas não podemos utilizá-lo com um arquivo, mas apenas combinando com outros comandos.
Por exemplo, quero transformar todos os caracteres do arquivo nomes para maiúsculo:
$ cat nomes Coletivo Digital Hugo Cisneiros (Eitch) Linux Tutorial $ cat nomes | tr [:lower:] [:upper:] COLETIVO DIGITAL HUGO CISNEIROS (EITCH) LINUX TUTORIAL
sed – Filtragem e Transformação de Conteúdo
Sintaxe: $ sed <comando/expressão> <arquivo>
O sed é um poderoso processador de texto que dentre muitas de suas ações, pode substituir ocorrências de texto por outros textos. Por exemplo, temos o texto:
$ cat texto Eu adoro música. Acho que sem música eu não seria nada, ficaria completamente triste, deprimido. Também acredito que todo ser humano precisa de música, afinal não importa o seu sabor, é sempre bom!
Agora vamos substituir a palavra música por Linux:
$ sed "s/música/Linux/g" texto Eu adoro Linux. Acho que sem Linux eu não seria nada, ficaria completamente triste, deprimido. Também acredito que todo ser humano precisa de Linux, afinal não importa o seu sabor, é sempre bom!
Neste exemplo, a primeira parte do comando (/s) disse ao sed para procurar as ocorrências de música e transformá-las para Linux. A última letra (g) diz para substituir todas as ocorrências da linha.
Você também pode preferir substituir o texto e alterar o arquivo diretamente (ao invés de aparecer apenas na tela). Para fazer isso, use o parâmetro -i:
$ sed -i "s/música/Linux/g" texto
Cuidado: O -i vai sobrescrever o arquivo original e você não vai ter um Undo (também conhecido como Ctrl+Z) para te ajudar! Mas combinando o -i com uma extensão, ele cria um backup pra você antes de substituir:
$ sed -i.backup "s/música/Linux/g" texto
Com isso ele vai criar o arquivo texto.backup com o texto original, e o o arquivo texto estará modificado.
Este é um dos usos mais comuns do sed, apesar dele poder fazer muito mais.