Propaganda

Dois dos utilitários Linux mais subestimados criminalmente são Sed e Awk. Embora eles possam parecer um pouco misteriosos, se você precisar fazer alterações repetitivas em grandes partes de código ou texto ou se precisar analisar algum texto, Sed e Awk são inestimáveis.

Então, o que são eles? Como eles são usados? E como, quando combinados, eles facilitam o processamento de texto?

O que é Sed?

Sed foi desenvolvido em 1971 em Bell Labs, pelo lendário pioneiro da computação Lee E. McMahon.

O nome significa editor de stream, e é isso que faz. Permite editar corpos ou fluxos de texto programaticamente, por meio de uma linguagem de programação compacta e simples, porém completa de Turing.

A maneira como funciona é simples: lê texto, linha por linha, em um buffer. Para cada linha, ele executará as instruções predefinidas, quando aplicável.

Por exemplo, se alguém escrevesse um script Sed que substituísse a palavra "cerveja" por "refrigerante" e passasse um arquivo de texto que continha todo o nas letras de “99 Garrafas de Cerveja na Parede”, ele passaria por esse arquivo linha por linha e imprimiria “99 Garrafas de Refrigerante na Parede”, e assim em.

instagram viewer

O script Sed mais básico é o do Hello World. Aqui, usamos o utilitário Unix Echo, que apenas gera strings, para imprimir "Hello World". Mas canalizamos isso para Sed e pedimos que substitua "World" por "Dave". Coisas auto-explicativas.

eco "Olá Mundo" | sed s / mundo / Dave
sedawk-dave

Você também pode combinar instruções Sed em arquivos, se precisar fazer uma edição mais complicada. Inspirado por esse hilariante tópico do Reddit, Eu vou levar a letra para o A-Ha's Preste atenção em mime substitua cada instância de "I", "Eu" e "Meu", por Greg.

Primeiro, colocarei a letra da música em um arquivo de texto chamado tom.txt. Abrirei meu editor de texto preferido (meu o favorito é Vim As 7 principais razões para dar uma chance ao editor de texto VimDurante anos, tentei um editor de texto após o outro. Você escolhe, eu tentei. Eu usei cada um desses editores por mais de dois meses como meu principal editor do dia-a-dia. De alguma forma, eu ... consulte Mais informação , mas Nano nano vs. vim: Editores de texto do terminal comparadosEmbora o Linux tenha se tornado fácil o suficiente para praticamente qualquer pessoa usar sem ter que usar o Terminal, há alguns de nós que o usam regularmente ou estão curiosos sobre como se pode controlar ... consulte Mais informação e Gedit gedit: um dos editores de texto sem formatação mais cheios de recursos [Linux e Windows]Quando você pensa em editores de texto simples, a primeira coisa que pode surgir na sua cabeça é o aplicativo Bloco de Notas do Windows. Ele faz exatamente o que a descrição de seu trabalho indica - recursos simples para um texto simples ... consulte Mais informação são excelentes opções) e adicione as seguintes linhas. Verifique se o arquivo que você cria termina com .sed.

sed-greg-sed

Você pode perceber que, no exemplo acima, eu me repeti (por exemplo, s / me / Greg / e s / Me / Greg /). Isso ocorre porque algumas versões do Sed, como a que acompanha o Mac OS X, não suporta correspondência sem distinção entre maiúsculas e minúsculas. Como resultado, temos que escrever duas instruções Sed para cada palavra, para que ela reconheça a versão em maiúscula e não capitalizada.

Isso não funcionará perfeitamente, como se você substituísse cada instância de "eu", "eu" e "meu" manualmente. Lembre-se, estamos apenas usando isso como um exercício para demonstrar como você pode agrupar instruções Sed em um script e, em seguida, executá-las com um único comando.

Então, precisamos invocar o arquivo. Para fazer isso, executamos este comando.

gato tom.txt | sed -f greg.sed

Vamos desacelerar e ver o que isso faz. Os leitores de olhos de águia terão notado que somos não usando Echo aqui. Estamos usando o gato. Isso ocorre porque, embora a Cat imprima todo o conteúdo do arquivo, o eco apenas imprime o nome do arquivo. Você também notou que estamos executando o Sed com a bandeira "-f". Isso diz para abrir o script como um arquivo.

O resultado final é este.

sed-greg-script

Também é importante notar que o Sed suporta expressões regulares (REGEX). Isso permite definir padrões no texto, usando uma sintaxe especial e complicada.

Aqui está um exemplo de como isso pode funcionar. Nós vamos pegar as letras das músicas mencionadas, mas use regex para imprimir todas as linhas que não comece com "Take".

gato tom.txt | sed / ^ Take / d
sed-regex-take

Sed é, obviamente, incrivelmente útil. Mas é ainda mais poderoso quando combinado com o Awk.

O que é o Awk?

Awk, como Sed, é uma linguagem de programação projetada para lidar com grandes corpos de texto. Mas enquanto o Sed é usado para processar e modificar o texto, o Awk é usado principalmente como uma ferramenta para análise e comunicando.

Como Sed, Awk foi desenvolvido pela primeira vez no Bell Labs na década de 1970. Seu nome não vem do que o programa faz, mas os sobrenomes de cada um dos autores - Alfred Aho, Peter Weinberger e Brian Kernaghan.

O Awk funciona lendo um arquivo de texto ou fluxo de entrada, uma linha por vez. Cada linha é digitalizada para verificar se corresponde a um padrão predefinido. Se uma correspondência for encontrada, uma ação é executada.

Mas, embora Sed e Awk possam compartilhar propósitos semelhantes, eles são dois idiomas completamente diferentes, com duas filosofias de design completamente diferentes. O Awk se assemelha mais a alguns linguagens de uso geral Como escolher uma linguagem de programação para aprender hoje e obter um ótimo emprego em 2 anosPode levar anos de trabalho dedicado para se tornar um bom programador; Então, existe uma maneira de escolher o idioma certo para começar hoje, para ser contratado amanhã? consulte Mais informação , como C, Python e Bash. Tem coisas como funções e uma abordagem mais semelhante a C para coisas como iteração e variáveis ​​(James Bruce explicou como a iteração funciona Os princípios absolutos da programação para iniciantes (parte 2)Na parte 2 do nosso guia absoluto para iniciantes de programação, falarei sobre o básico de funções, valores de retorno, loops e condicionais. Leia a parte 1 antes de abordar isso, onde expliquei o ... consulte Mais informação ). Simplificando, parece mais uma linguagem de programação.

Então, vamos tentar. Usando a letra do Take On Me, imprimiremos todas as linhas com mais de 20 caracteres.

awk 'length ($ 0)> 80' tom.txt awk-length

O próximo exemplo que eu tenho descaradamente berço de a documentação oficial do Awk. Mas é um ótimo exemplo do potencial dessa linguagem poderosa, mas minúscula. Também é uma ótima demonstração de como coisas como iteração e variáveis ​​funcionam nela. Primeiro, crie um arquivo chamado “WordCount.awk” e adicione as seguintes linhas.

{para (i = 1; i <= NF; i ++) freq [$ i] ++ }
END {para (palavra em frequência) printf "% s \ t% d \ n", palavra, frequência [palavra] }

Salve-o e execute-o com o seguinte comando.

awk -f WordCount.awk tom.txt

awk-wordcount
Legal certo? Você provavelmente notará que eles não estão em nenhum tipo de ordem. Vocês lata classifique os resultados usando o utilitário de classificação Unix. Mas vamos deixar isso para outro dia. Vamos manter as coisas simples.

Combinando os dois

Awk e Sed são incrivelmente poderosos quando combinados. Você pode fazer isso usando pipes Unix. Esses são os "|" bits entre comandos.

Vamos tentar o seguinte: listaremos todas as linhas do Take On Me com mais de 20 caracteres usando o Awk. Então, nós vamos remover todas as linhas que começam com "Toma". Juntos, tudo se parece com isso:

awk 'length ($ 0)> 20' tom.txt | sed / ^ Take / d

E produz o seguinte:

awk-length-sed

Agora vamos reverter isso. Começaremos removendo todas as linhas que começam com Take e, em seguida, direcione-as para o Awk, onde contaremos quantas vezes cada palavra aparece. Parece um pouco com isso:

gato tom.txt | sed / ^ Tirar / d | awk -f WordCount.awk
awk-wordcount-sed

O poder de Sed e Awk

Há muito o que você pode explicar em um único artigo. Mas espero ter ilustrado como Sed e Awk são incomensuravelmente poderosos. Simplificando, eles são uma potência de processamento de texto.

Então por que você deveria se preocupar? Bem, além do fato de você nunca saber quando precisa fazer alterações previsíveis e repetitivas em um documento de texto, Sed e Awk são ótimos para analisar arquivos de log. Isso é especialmente útil quando você está tentando depurar um problema no seu servidor LAMP Inscreveu-se na hospedagem na Web somente SSH? Não se preocupe - instale facilmente qualquer software da WebVocê não sabe a primeira coisa sobre a operação do Linux por meio de sua poderosa linha de comando? Não se preocupe mais. consulte Mais informação , ou olhando seus logs de acesso para ver se seu servidor foi invadido.

Você encontrou um uso interessante para Sed e Awk? Existem outros utilitários do Linux que você considera subestimados? Deixe-me saber nos comentários abaixo e conversaremos.

Matthew Hughes é desenvolvedor e escritor de software de Liverpool, Inglaterra. Ele raramente é encontrado sem uma xícara de café preto forte na mão e adora absolutamente o Macbook Pro e a câmera. Você pode ler o blog dele em http://www.matthewhughes.co.uk e siga-o no twitter em @matthewhughes.