Filtros e fluxos de textos
- jefftersouza
- 16 de dez. de 2015
- 8 min de leitura
Filtragem de textos
A filtragem de textos é o processo de executar algumas conversões no texto de um fluxo de entrada de texto antes de enviá-lo para um fluxo de saída. Embora tanto a entrada como a saída possam vir de um arquivo, nos ambientes UNIX® e Linux, a filtragem é, na maioria das vezes, feita através da criação de uma pipeline de comandos, na qual a saída de um comando é canalizada ou redirecionada para ser usada como a entrada para o próximo. Canais e redirecionadores são abordados mais detalhadamente no artigo sobre fluxos, canais e redirecionadores (que você encontra na série roteiros). Porém, por enquanto, vamos dar uma olhada nos canais e redirecionamentos de saída básicos usando os operadores | e >.
Fluxos
Um fluxo é nada mais que uma sequência de bytes que pode ser lida ou escrita através do uso de funções da biblioteca, as quais escondem os detalhes de um dispositivo subjacente do aplicativo. O mesmo programa pode ler ou escrever em um terminal, arquivo ou soquete de rede em uma direção independente de dispositivo através do uso de fluxos. Ambientes modernos de programação e shells usam três fluxos padrão de E/S:
stdin é o fluxo de entrada padrão, que fornece a entrada para os comandos.
stdout é o fluxo de saída padrão, que exibe a saída dos comandos.
stderr é o fluxo de erro padrão, que exibe a saída de erros dos comandos.
Canalizando com |
A entrada pode vir de parâmetros que você fornece aos comandos e a saída pode ser exibida em seu terminal. Muitos comandos de processamento de texto (filtros) podem receber entradas tanto de um fluxo de entrada padrão quanto de um arquivo. Para usar a saída de um comando, command1, como entrada para um filtro, command2, você deve conectar os comandos usando o operador de canal (I). A Listagem 1 mostra como canalizar a saída de echo para classificar uma pequena lista de palavras.
Listagem 1. Canalizando saídas de echo para entradas de classificação
[ian@echidna ~]$ echo -e "apple\npear\nbanana"|sort apple banana pear
Qualquer comando pode ter opções e argumentos. Também é possível usar | para redirecionar a saída do segundo comando na pipeline para um terceiro comando, e assim por diante. Construir longas pipelines de comandos, em que cada uma tenha uma capacidade limitada, é um modo comum de executar tarefas no Linux e no UNIX. Às vezes, você verá um hífen (-) no lugar do nome do arquivo como um argumento para um comando, indicando que a entrada deve vir do stdin e não de um arquivo.
Redirecionamento de saída com >
Embora você possa criar uma pipeline com muitos comandos e visualizar a saída no seu terminal, às vezes, você desejará salvar a saída em um arquivo. Isso é feito com o operador de redirecionamento de saída (>).
Durante o resto desta seção, usaremos pequenos arquivos, assim, vamos então criar um diretório chamado lpi103-2 e fazer cd nesse diretório. Usaremos então o > para redirecionar a saída do comando echo para um arquivo chamado text1. Tudo isso é exibido na Listagem 2. Observe que a saída não é exibida no terminal, pois foi redirecionada para um arquivo.
Listagem 2. Redirecionando a saída de um comando para um arquivo
[ian@echidna ~]$ mkdir lpi103-2 [ian@echidna ~]$ cd lpi103-2 [ian@echidna lpi103-2]$ echo -e "1 apple\n2 pear\n3 banana" > text1
Agora que já temos algumas ferramentas básicas para canalizar e redirecionar, vamos dar uma olhada em alguns comandos e filtros de processamento de texto comuns do Linux e do UNIX. Esta seção apresenta alguns dos recursos básicos; consulte a man page apropriada para mais informações sobre estes comandos.
Voltar para parte superior
Cat, od e split
Agora que você já criou o arquivo text1, você pode querer verificar o que há nele. Use o comando cat (abreviação de concatenate) para exibir o conteúdo de um arquivo no stdout. A Listagem 3 verifica o conteúdo do arquivo criado acima.
Listagem 3. Exibindo conteúdos de arquivos com o comando cat
[ian@echidna lpi103-2]$ cat text1 1 apple 2 pear 3 banana
O comando cat recebe a entrada a partir do stdin, caso você não especifique um nome de arquivo (ou se você especifica - como o nome do arquivo). Vamos usar isso junto com o redirecionamento de saída para criar outro arquivo de texto, como exibido na Listagem 4.
Listagem 4. Criando um arquivo de texto com o comando cat
[ian@echidna lpi103-2]$ cat >text2 9 plum 3 banana 10 apple
Muitos filtros pequenos
Outro exemplo de um filtro pequeno é o comando tac. O nome é o contrário de cat, assim como a função, que também é oposta a do comando cat, exibindo o arquivo na ordem inversa. Tente você mesmo executar tac text2 text1 .
Na Listagem 4, cat continua lendo a partir do stdin até o fim do arquivo. Usa a combinação Ctrl-d (segure Ctrl e pressione d) parar indicar o fim do arquivo. Esta é a mesma combinação de teclas para sair do bash shell. Use a tecla tab para alinhar os nomes das frutas em uma coluna.
Você lembra que cat é uma abreviação de concatenate? É possível usar o comando cat para concatenar vários arquivos para exibição. A Listagem 5 exibe os dois arquivos que acabamos de criar.
Listagem 5. Concatenando dois arquivos com o comando cat
[ian@echidna lpi103-2]$ cat text* 1 apple 2 pear 3 banana 9 plum 3 banana 10 apple
Ao exibir esses dois arquivos de texto usando o comando cat, você irá notar diferenças de alinhamento. Para descobrir o motivo dessa diferença, é necessário verificar os caracteres de controle do arquivo. Estes são colocados em prática na saída de exibição de texto, em vez de terem alguma representação do próprio caractere de controle exibida, assim, é necessário fazer dump no arquivo em um formato que permita localizar e interpretar esses caracteres especiais. As utilidades de texto GNU incluem um comando voltado para esse propósito, o comando od (ou Octal Dump).
Há muitas opções para o comando od, como, por exemplo, a opção -A, que controla a base dos deslocamentos de arquivo, e a opção -t, que controla a forma dos conteúdos do arquivo exibidos. A base pode ser especificada como o, (octal, que é o padrão), d (decimal), x (hexadecimal) ou n (sem deslocamentos exibidos). É possível exibir a saída como octal, hex, decimal, ponto flutuante, ASCII com escapes de barra invertida ou caracteres nomeados (nl for nova linha, ht para tabulação horizontal, etc.). A Listagem 6 exibe alguns dos formatos disponíveis para fazer dump do arquivo de exemplo text2.
Listagem 6. Fazendo dump de arquivos com o comando od
[ian@echidna lpi103-2]$ od text2 0000000 004471 066160 066565 031412 061011 067141 067141 005141 0000020 030061 060411 070160 062554 000012 0000031 [ian@echidna lpi103-2]$ od -A d -t c text2 0000000 9 \t p l u m \n 3 \t b a n a n a \n 0000016 1 0 \t a p p l e \n 0000025 [ian@echidna lpi103-2]$ od -A n -t a text2 9 ht p l u m nl 3 ht b a n a n a nl 1 0 ht a p p l e nl
Observações:
A opção -A do comando cat fornece uma maneira alternativa para ver onde estão os seus finais de linhas e as suas tabulações. Consulte a man page para obter mais informações.
Caso você use espaços ao invés de tabulações em seu arquivo text2, consulte Expand, unexpand, e tr, mais adiante neste artigo, para ver como alternar entre tabulações e espaços em um arquivo.
Caso tiver um plano de fundo como mainframe, você pode ter interesse na utilidade hexdump, que faz parte de um conjunto de utilidades diferente. Como isso não é abordado aqui, consulte as man pages.
Os nossos arquivos de exemplo são muito pequenos, porém, às vezes, você trabalhará com arquivos grandes, os quais deverão ser divididos em partes menores. Por exemplo, você pode querer dividir um arquivo grande em partes do tamanho de CDs, de modo que seja possível gravar os arquivos em CDs para enviar os mesmos pelo correio para alguém que possa criar um DVD para você. O comando split fará isso de modo que o comando cat possa ser usado para recriar o arquivo facilmente. Como padrão, os arquivos resultantes do comando split têm um prefixo 'x' em seus nomes, seguido de um sufixo 'aa', 'ab', 'ac', ..., 'ba', 'bb', etc. Há opções que permitem alterar esse padrão. Também é possível controlar o tamanho dos arquivos de saída e se o arquivo resultante contém linhas inteiras ou somente contagens de bytes.
A Listagem 7 ilustra a divisão dos nossos dois arquivos de texto com prefixos diferentes para os arquivos de saída. Nós dividimos o arquivo text1 em arquivos contendo no máximo duas linhas, e o text2 em arquivos contendo no máximo 18 bytes. Usamos então o comando cat para exibir individualmente algumas das partes, assim como para exibir um arquivo completo usando globbing, abordado no artigo gerenciamento básico de arquivos (que pode ser encontrado na série roteiros).
Listagem 7. Dividindo e recombinando com os comandos split e cat
[ian@echidna lpi103-2]$ split -l 2 text1 [ian@echidna lpi103-2]$ split -b 17 text2 y [ian@echidna lpi103-2]$ cat yaa 9 plum 3 banana 1[ian@echidna lpi103-2]$ cat yab 0 apple [ian@echidna lpi103-2]$ cat y* x* 9 plum 3 banana 10 apple 1 apple 2 pear 3 banana
Observe que o arquivo dividido nomeado como yaa não acabou com um caractere de linha nova, assim, o nosso prompt foi deslocado após usarmos o comando cat para exibi-lo.
Voltar para parte superior
Wc, head e tail
O comando Cat exibe todo o arquivo. Isso funciona bem com arquivos pequenos, porém, vamos supor que estamos trabalhando com um arquivo grande. Primeiramente, você pode usar o comando wc (Word Count) para ver o quão grande é o arquivo. O comando wc exibe o número de linhas, palavras e bytes em um arquivo. Também é possível descobrir o número de bytes usando ls -l. A Listagem 8 exibe a listagem de diretório de formato longo para os nossos dois arquivos de texto, assim como a saída do comando wc.
Listagem 8. Usando o comando wc com arquivos de texto
Clique aqui para ver lista de códigos
Há opções que permitem controlar a saída de wc ou exibir outras informações, como, por exemplo, o comprimento máximo das linhas. Consulte a man page para obter mais detalhes.
Dois comandos permitem exibir a primeira (head) ou última (tail) parte de um arquivo. Esses comandos são head e tail. Eles podem ser usados como filtros, ou podem tomar um nome de arquivo como um argumento. Como padrão, eles exibem as primeiras (ou últimas) 10 linhas do arquivo ou fluxo. A Listagem 9 usa o comando dmesg para exibir mensagens de inicialização, em conjunto com os comandos wc, tail e head, para descobrir que há 791 mensagens, exibir as últimas 10 linhas destas mesmas e, finalmente, exibir as seis mensagens começando 15 a partir do final. Algumas linhas foram truncadas nesta saída (indicadas por ...).
Listagem 9. Usando wc, head e tail para exibir mensagens de boot
[ian@echidna lpi103-2]$ dmesg|wc 791 5554 40186 [ian@echidna lpi103-2]$ dmesg | tail input: HID 04b3:310b as /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2.4/3-2.4:1.0/input/i nput12 generic-usb 0003:04B3:310B.0009: input,hidraw1: USB HID v1.00 Mouse [HID 04b3:310b] on us b-0000:00:1a.0-2.4/input0 usb 3-2.4: USB disconnect, address 11 usb 3-2.4: new low speed USB device using uhci_hcd and address 12 usb 3-2.4: New USB device found, idVendor=04b3, idProduct=310b usb 3-2.4: New USB device strings: Mfr=0, Product=0, SerialNumber=0 usb 3-2.4: configuration #1 chosen from 1 choice input: HID 04b3:310b as /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2.4/3-2.4:1.0/input/i nput13 generic-usb 0003:04B3:310B.000A: input,hidraw1: USB HID v1.00 Mouse [HID 04b3:310b] on us b-0000:00:1a.0-2.4/input0 usb 3-2.4: USB disconnect, address 12 [ian@echidna lpi103-2]$ dmesg | tail -n15 | head -n 6 usb 3-2.4: USB disconnect, address 10 usb 3-2.4: new low speed USB device using uhci_hcd and address 11 usb 3-2.4: New USB device found, idVendor=04b3, idProduct=310b usb 3-2.4: New USB device strings: Mfr=0, Product=0, SerialNumber=0 usb 3-2.4: configuration #1 chosen from 1 choice input: HID 04b3:310b as /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2.4/3-2.4:1.0/input/i nput12
Outro uso comum de tail é seguir um arquivo usando a opção -f, normalmente com uma contagem de linha de 1. Você pode usar essa opção quando um processo de segundo plano está gerando saída em um arquivo e você deseja verificar como está o andamento. Neste modo, o comando tail será executado até que você o cancele (usando Ctrl-c), exibindo as linhas conforme elas são escritas no arquivo.

Comments