O que há de novo no Awk?
Brian Kernighan discute a ferramenta de script Awk, desde sua criação até o trabalho atual sobre suporte Unicode.
Awk é uma ferramenta de script poderosa que facilita o processamento de texto. Os scripts Awk usam uma sintaxe pattern-action, onde o Awk executa uma ação para cada linha em um arquivo que corresponda a um padrão. Isso fornece uma linguagem de script flexível, porém poderosa, para lidar com texto. Por exemplo, o script Awk de uma linha /error/ {print $1, $2, $3}
imprimirá os três primeiros campos delimitados por espaço para qualquer linha que contenha a palavra error
.
Embora também tenhamos a variante GNU do Awk, chamada Gawk, o Awk original permanece em desenvolvimento. Recentemente, Brian Kernighan iniciou um projeto para adicionar suporte Unicode ao Awk. Encontrei-me com Brian para perguntar sobre as origens do Awk e seu recente trabalho de desenvolvimento no Awk.
Jim Hall: Awk é uma ótima ferramenta para analisar e processar texto. Como tudo começou?
Brian Kernighan: A influência mais direta foi uma ferramenta que Marc Rochkind desenvolveu enquanto trabalhava no sistema Programmer's Workbench no Bell Labs. Pelo que me lembro agora, o programa de Marc pegou uma lista de expressões regulares e criou um programa C que leria um arquivo de entrada. Sempre que o programa encontrava uma correspondência para uma das expressões regulares, ele imprimia a linha correspondente. Ele foi projetado para criar verificação de erros para executar arquivos de log de dados de operações telefônicas. Foi uma ideia muito legal – Awk é apenas uma generalização.
Jim: AWK representa vocês três que o criaram: Al Aho, Peter Weinberger e Brian Kernighan. Como vocês três projetaram e criaram o Awk?
Brian: Al estava interessado em expressões regulares e implementou recentemente o egrep, que forneceu uma técnica de avaliação lenta muito eficiente para uma classe de expressões regulares muito maior do que a fornecida pelo grep. Isso nos deu uma sintaxe e um código funcional.
Peter estava interessado em bancos de dados e, como parte disso, tinha algum interesse na geração de relatórios, como a linguagem RPG fornecida pela IBM. E eu estava tentando descobrir algum tipo de sistema de edição que tornasse possível lidar com strings e números com mais ou menos igual facilidade.
Exploramos designs, mas não por muito tempo. Acho que Al pode ter fornecido o paradigma básico de ação padrão, mas isso estava implícito em uma variedade de ferramentas existentes, como grep, o editor de fluxo sed e nas ferramentas de linguagem YACC e Lex que usamos para implementação. Naturalmente, a linguagem de ação tinha que ser semelhante a C.
Jim: Como o Awk foi usado pela primeira vez no Bell Labs? Quando o Awk foi adotado pela primeira vez no Unix?
Brian: O Awk foi criado em 1977, então fazia parte da 7ª edição do Unix, que acho que apareceu por volta de 1979. Eu não diria que foi adotado, mas sim apenas mais um programa. incluído porque estava lá. As pessoas perceberam isso muito rapidamente e logo tivemos usuários em todos os laboratórios. As pessoas também escreveram programas muito maiores do que havíamos previsto, até mesmo dezenas de milhares de linhas, o que foi incrível. Mas para alguns tipos de aplicações, a linguagem era uma boa opção.
Jim: O Awk mudou ao longo dos anos ou o Awk de hoje é mais ou menos o mesmo Awk de 1977?
Brian: No geral, tem sido bastante estável, mas houve um bom número de pequenas coisas, principalmente para acompanhar pelo menos as partes principais do Gawk. Os exemplos incluem coisas como funções para fazer conversão de maiúsculas e minúsculas, atalhos para alguns tipos de expressões regulares ou nomes de arquivos especiais como /dev/stderr
. Internamente, tem havido muito trabalho para substituir arrays de tamanho fixo por arrays que crescem. Arnold Robbins, que mantém o Gawk, também tem sido extremamente útil com o Awk, fornecendo bons conselhos, testes, código e ajuda com o Git.
Jim: Atualmente você está adicionando suporte Unicode ao Awk. Este é um daqueles projetos que parece óbvio quando você ouve falar dele, porque o Unicode está em toda parte, mas nem todos os programas o suportam ainda. Conte-nos sobre seu projeto para adicionar Unicode ao Awk.
Brian: Já faz algum tempo que é meio embaraçoso que o Awk só lide com entradas de 8 bits, embora, para ser justo, ele anteceda o Unicode em 10 ou 20 anos. Gawk, a versão GNU, tem lidado com o Unicode corretamente há um bom tempo, então é bom estar atualizado e compatível.
Jim: Qual é o tamanho do projeto adicionando suporte a Unicode? Isso exigiu muitas alterações no código-fonte?
Brian: Eu não contei, mas provavelmente são 200 ou 300 linhas, concentradas principalmente no reconhecedor de expressões regulares ou nas diversas funções integradas que precisam operar em caracteres, não em bytes, para Entrada Unicode.
Jim: Há quanto tempo você está adicionando Unicode ao Awk?
Brian: Há uma ramificação do código no GitHub que está bastante atualizada. Foi testado, mas sempre há espaço para mais testes.
Uma coisa a mencionar: ele lida com entrada e saída UTF-8, mas para pontos de código Unicode, que não são a mesma coisa que grafemas Unicode. Esta distinção é importante, mas tecnicamente muito complicada, pelo menos no meu entender. Como exemplo simples, uma letra com acento pode ser representada como dois pontos de código (letra e acento) ou como um único caractere (grafema). Fazer isso direito, seja lá o que isso signifique, é muito difícil.
Jim: Em um vídeo do Computerphile, você menciona a adição de suporte para análise de valores separados por vírgula (CSV) ao Awk. Como está indo esse projeto?
Brian: Enquanto eu estava com as mãos no código novamente, adicionei suporte para entrada CSV, já que essa é outra parte da linguagem que sempre foi desajeitada. Não fiz nada para a saída CSV, pois isso é fácil de fazer com algumas funções curtas, mas talvez isso deva ser revisado.
Jim: Para que tipos de coisas você usa o Awk no seu trabalho diário?
Brian: Tudo. Praticamente qualquer coisa que mexa no texto é um alvo para o Awk. Certamente, o programa Awk que mais uso é simples para fazer com que todas as linhas de um documento de texto tenham o mesmo comprimento. Provavelmente o usei 100 vezes enquanto escrevia respostas às suas perguntas.
Jim: Qual foi a coisa mais legal (ou mais incomum) que você já fez com o Awk?
Brian: Há muito tempo, escrevi um programa C++ que convertia programas Awk em C++ que parecia o mais próximo possível do Awk, fazendo coisas como sobrecarregar colchetes para matrizes associativas. Nunca foi usado, mas foi um exercício divertido.
Leitura adicional
- Folha de dicas do Awk
- Um guia prático para aprender Awk (e-book)