segunda-feira, 4 de janeiro de 2010

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 “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.
Este é um dos usos mais comuns do sed, apesar dele poder fazer muito mais.

0 comentários :

Enviar um comentário