Linha de Comando: Aprenda um pouco de jq, awk e sed
Tags: ptbr, devops, productivity, webdev
Published: 2019-10-05 10:36:10

# Créditos

- [Learn a little jq, awk and sed](https://letterstoanewdeveloper.com/2019/07/29/learn-a-little-jq-awk-and-sed/), escrito originalmente por Dan

---

Caro novo desenvolvedor,

Você provavelmente estará lidando com arquivos de texto em algum momento durante sua carreira de desenvolvimento. Estes podem ser texto simples, csv ou json. Eles podem ter dados que você deseja divulgar ou arquivos de log que você deseja examinar. Você pode estar transformando de um formato para outro.

Agora, se essa é uma ocorrência regular, convém criar um script ou programa para solucionar esse problema (ou usar um serviço de terceiros que agregue tudo). Mas, às vezes, esses arquivos são únicos. Ou você os usa uma vez na lua azul. E pode demorar um pouco para escrever um script, olhar para as bibliotecas e juntar tudo.

Outra alternativa é aprender algumas das ferramentas unix disponíveis na [linha de comando](https://letterstoanewdeveloper.com/2019/02/04/learn-the-command-line/). Aqui estão três que considero essenciais.

# awk

Este é um utilitário de processamento de linha de múltiplos propósitos. Muitas vezes eu quero pegar linhas de um arquivo de log e descobrir o que está acontecendo. Aqui estão algumas linhas de um arquivo de log:

```bash
54.147.20.92 - - [26/Jul/2019:20:21:04 -0600] "GET /wordpress HTTP/1.1" 301 241 "-" "Slackbot 1.0 (+https://api.slack.com/robots)"
185.24.234.106 - - [26/Jul/2019:20:20:50 -0600] "GET /wordpress/archives/date/2004/02 HTTP/1.1" 200 87872 "http://www.mooreds.com" "DuckDuckBot/1.0; (+http://duckduckgo.com/duckduckbot.html)"
185.24.234.106 - - [26/Jul/2019:20:20:50 -0600] "GET /wordpress/archives/date/2004/08 HTTP/1.1" 200 81183 "http://www.mooreds.com" "DuckDuckBot/1.0; (+http://duckduckgo.com/duckduckbot.html)"
```

Se eu quiser ver apenas os endereços IP (supondo que todos estejam em um arquivo chamado logs.txt), eu executaria algo como:

```bash
$ awk '{print $1}' logs.txt

54.147.20.92
185.24.234.106
185.24.234.106
```

E existem muito mais possibilidades! Você pode ver que você pode fatiar e cortar dados delimitados com bastante facilidade. Aqui está um [ótimo artigo que mergulha ainda mais em awk](https://developer.ibm.com/tutorials/l-awk1/).

# sed

Este é outro utilitário de linha de comando. Você pode usá-lo para todos os tipos de coisas, mas eu o uso principalmente para pesquisar e substituir um arquivo. Suponha que você tenha o mesmo arquivo de log, mas deseje anonimizar o endereço IP e o agente do usuário. Talvez você os envie para armazenamento a longo prazo ou algo assim. Você pode remover isso facilmente com alguns comandos sed.

```bash
$ sed 's/^[^ ]*//' logs.txt |sed 's/"[^"]*"$//'

- - [26/Jul/2019:20:21:04 -0600] "GET /wordpress HTTP/1.1" 301 241 "-"
- - [26/Jul/2019:20:20:50 -0600] "GET /wordpress/archives/date/2004/02 HTTP/1.1" 200 87872 "http://www.mooreds.com"
- - [26/Jul/2019:20:20:50 -0600] "GET /wordpress/archives/date/2004/08 HTTP/1.1" 200 81183 "http://www.mooreds.com"
```

Sim, parece umas sujeiras na linha de comando, mas esse é o poder das expressões regulares. Eles estão em todos os idiomas (embora com pequenas variações) e valem a pena aprender. O sed fornece a você o poder de expressões regulares na linha de comando para processar arquivos. Não encontrei um ótimo tutorial sobre sed, mas o Google mostra alguns.

# jq

Se você trabalha na linha de comando com software moderno, você já encontrou a extensão json. É usado para arquivos de configuração e transmissão de dados. Às vezes, você obtém um array de json e deseja apenas escolher alguns atributos. Ferramentas como sed e awk falham nisso, porque são usadas para novas linhas que separam registros, não chaves e vírgulas. Claro, você pode usar expressões regulares para analisar json simples e há momentos em que eu faço isso. Mas uma ferramenta muito melhor é o [jq](https://stedolan.github.io/jq/). Não sou tão experiente com isso quanto com os outros, mas o uso sempre que estou lidando com uma API que fornece json. Eu posso consultar a API com [curl](https://curl.haxx.se/) (outra ótima ferramenta) e analisá-la com jq. Posso colocar tudo isso em um script e ter a exploração repetível.

Fiz isso alguns meses atrás, quando estava explorando um sistema de *elastic search*. Criei as consultas com curl e, em seguida, usei o jq para analisar os resultados para que eu pudesse entender isso. Sim, eu poderia ter feito isso com uma linguagem de programação real, mas levaria mais tempo. Eu também poderia ter usado uma ferramenta de interface gráfica como o Postman, mas não seria replicável.

sed e awk devem estar em todos os sistemas que você trabalhar; jq não é padrão, mas fácil de instalar. Vale a pena gastar algum tempo conhecendo essas ferramentas. Portanto, da próxima vez que você estiver processando um arquivo de texto e precisar extrair um pouco dele, procure sed e awk. Da próxima vez que você obtiver um arquivo json complicado e estiver olhando para ele, veja jq. Eu acho que você ficará feliz com o resultado.

Atenciosamente,

Dan