Filtros p/ processamento de texto em Linux - Parte 1
Mais um artigo sobre um assunto já bem discutido mas que ainda causa muita confusão.
Vamos aprender a processar streams de texto, usando ferramentas simples e muito úteis, disponÃveis em qualquer distribuição linux
O artigo será dividido em partes, pra não ficar extenso demais.
A maioria dos arquivos com os quais precisamos lidar no linux são de texto puro (text/plain). Arquivos de configuração e de logs,
por exemplo. O linux - e também a maioria (senão todos) dos sistemas baseados em Unix - fornecem ferramentas para o processamento
desse tipo de arquivos. Entenda também por arquivo, texto passado aos comandos por meio da entrada padrão (stdin), já que
é assim que o shell o trata.
As ferramentas
As ferramentas usadas para manipulação de streams de texto no linux fazem parte de um pacote chamado GNU textutils,
que agora faz parte do pacote GNU coreutils, com excessão do xargs que faz parte de findutils
e do sed, que faz parte de um pacote separado. As ferramentas que serão usadas neste texto são:
Cut
Exibe na saÃda padrão (stdout), ou seja, no terminal, colunas ou campos de um ou mais arquivos. O arquivo original
não é modificado. É útil quando se precisa de uma fatia vertical de um arquivo. O delimitador padrão é o tab
Sintaxe:
cut opções [arquivos]
Opções mais utilizadas:
- -b lista-bytes
- Mostra apenas os bytes nas posições listadas em lista-bytes. Tabs e backspaces são tratados como qualquer outro caractere,
já que ocupam 1 byte. - -c lista-caracteres
- Mostra apenas os caracteres nas posições listadas em lista-caracteres. Por enquanto, seu efeito é idêntico ao de -b,
mas a internacionalização e o uso de caracteres unicode vai mudar isso, já que caracteres internacionais
podem ocupar mais de 1 byte, mas continuam sendo apenas 1 caractere. - -f lista-campos
- Mostra apenas os campos listados em lista-campos. O delimitador padrão para os campos é o caractere tab.
- -d delimitador
- Deve ser usado em conjunto com a opção -f. Define o delimitador de campos.
- -n
- Não quebrar caracteres com mais de 1 byte. Esta opção não é usada no momento. Terá efeito apenas com a internacionalização.
lista-bytes, lista-caracteres e lista-campos pode ser um número apenas, uma lista de números separada
por vÃrgula ou um intervalo separado por hÃfem (-).
Exemplos do uso de cut
Vamos usar como exemplo o arquivo /etc/passwd, que tem o formato:
root:x:0:0:root:/root:/bin/bash
bruno:x:100:100:bruno:/home/bruno:/bin/bash
cut -b2 /etc/passwd
o
r
cut -d: -f6 /etc/passwd
/root
/home/bruno
Fmt
Formata o texto em uma largura de, no máximo, um dado número de caracteres (75 por padrão). Se for informado mais de um arquivo, eles serão
concatenados na saÃda.
Sintaxe:
fmt opções [arquivos]
Opções mais utilizadas:
- -u
- Usa espaçamento uniforme. Um espaço entre palavras e dois entre sentenças.
- -w largura
- Define a largura para um número diferente do padrão, 75.
Head
Exibe as primeiras (10, por padrão) linhas de um arquivo. Se mais de um arquivo for informado, as primeiras linhas de cada
um serão exibidas separadamente.
Sintaxe:
head opções [arquivos]
Opções mais utilizadas:
- -c n
- Exibe os primeiros n bytes de cada arquivo. Pode-se usar os sufixos k ou m, significando
kilobytes e megabytes, respectivamente. - -n
- Exibe as primeiras n linhas de cada arquivo. O padrão é 10.
Exemplo:
head -2 /etc/passwd /etc/protocols
==> /etc/passwd <==
root:x:0:0:root:/root:/bin/bash
bruno:x:100:100:bruno:/home/bruno:/bin/bash
==> /etc/protocols <==
ip 0 IP
icmp 1 ICMP
Join
Esse comando parece meio estranho, mas pode ser útil. Ele faz algo parecido com um join de tabelas em um banco de dados -
de maneira simplista. Ele exibe uma linha para cada par de linhass de arquivo1 e arquivo2 que contenham campos
idênticos para junção.
Sintaxe:
join opções arquivo1 arquivo2
Opções:
- -j1 campo
- Usar o campo de arquivo1 como referência para a junção.
- -j2 campo
- Usar o campo de arquivo2 como referência para a junção.
- -j campo
- Usar o mesmo campo de arquivo1 e arquivo2 como referência para a junção.
Exemplo:
Suponha o seguinte arquivo1
1 linux 2 freebsd 3 macosx 4 ruindous
E o seguinte arquivo2
1 2.6.8.1 2 5.3 3 10.4 4 XPSP2
Use o comando:
join -j1 arquivo1 arquivo2
Essa será a saÃda:
1 linux 2.6.8.1
2 freebsd 5.3
3 macosx 10.4
4 ruindous XPSP2
Mais no próximo artigo…
[Nota]Este artigo foi baseado no livro LPI Linux Certification in a Nutshell - Editora O’Reilly ISBN: 1-56592-746-6, tópico 1.3 objetivo 2 “Process Text Streams Using Text-Processing Filters” e nas info e manpages dos referidos comandos.


E ae Bruno,
Anda inspirado hein… parabens.