Comandos de Tratamento de Texto
Com toda a quantidade de arquivos textos existentes no Linux (documentos, configura莽玫es, listas), os comandos de tratamento de texto podem se tornar ferramentas 煤teis para a rotina di谩ria de um administrador de sistema.
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@coletivodigital.org.br hugo@devin.com.br www.kernel.org www.google.com.br
Juntando os dois arquivos com o paste:
$ paste nomes enderecos Coletivo Digital email@coletivodigital.org.br Hugo Cisneiros (Eitch) hugo@devin.com.br 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 鈥渟/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.
Este 茅 um dos usos mais comuns do sed, apesar dele poder fazer muito mais.



