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.

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.

Leia também:

5 Comentários sobre “Filtros p/ processamento de texto em Linux - Parte 1”

Faça um comentário

E ae Bruno,

Anda inspirado hein… parabens.


Parece que tu anda estudando para LPIC =)

Quase todos os seus últimos artigos fazem parte do conteúdo da prova do LPIC-1.


To estudando pra LPIC sim…hehehe… Como esse livro é muito bom, resolvi compartilhar o conhecimento com vocês.


Bruno, parabens pela iniciativa! Divulgacao de conhecimento e dicas, principalmente pra quem vai fazer o LPI-1, sao sempre bem vindas.

Outra boa referencia que indicaria (alem da Biblia da Certificacao LPIC) seria o \”Aprenda Unix em 24 horas\”, que tambem eh bem completo com relacao a filtros de texto, inclusive dentro dos editores Vim e Emacs.


#5 | Carlos Ribeiro

Parabéns Bruno. Os iniciantes, como eu, sentir-se-ão beneficiados com artigos semelhantes. Aguardaremos com grande interesse a continuação prometida.


« Entendendo os links e links simbólicos

Filtros p/ processamento de texto em linux - Parte 2 »

Deixe seu comentário

Buscas populares: Ganhar dinheiro, AdSense, Velox, Acessibilidade, IE7, CSS Position, Quero ganhar dinheiro