Extração de colunas com AWK

LinuxBeginner
Pratique Agora

Introdução

Ao trabalhar com dados de texto estruturados no Linux, como arquivos de log, CSVs ou arquivos de configuração, é comum precisar extrair colunas específicas de informações. Por exemplo, você pode querer obter apenas os nomes de usuário de um arquivo do sistema ou os códigos de status de um log de acesso web.

A principal ferramenta para essa tarefa é o awk.

O awk trata o texto como uma série de registros (linhas) e campos (colunas). Essa é uma das razões pelas quais o texto simples continua sendo tão útil no Linux: muitos formatos de dados administrativos são fáceis de inspecionar visualmente e de processar com ferramentas de linha de comando.

  • Registros geralmente são separados por quebras de linha.
  • Campos geralmente são separados por espaços em branco (espaços ou tabulações).

Esse modelo de “registros e campos” é a estrutura mental que torna o awk muito mais fácil de entender. Em vez de enxergar um arquivo como texto bruto, o awk o vê como linhas e colunas estruturadas que podem ser referenciadas diretamente.

Neste laboratório, você aprenderá a usar o awk para:

  1. Selecionar campos: extrair colunas específicas usando $1, $2 etc.
  2. Definir separadores de campos: processar dados separados por caracteres diferentes de espaços, como dois-pontos ou vírgulas, usando a opção -F.
  3. Referenciar o último campo: acessar dinamicamente o final de uma linha usando $NF.

Extrair o primeiro campo

Vamos começar com um arquivo simples, separado por espaços. Nós criamos data.txt para você.

Veja o conteúdo do arquivo:

cat data.txt

Saída:

John 25 Engineer
Alice 30 Manager
Bob 22 Intern

Para o awk, cada linha é um registro e cada palavra é um campo:

  • Campo 1 ($1): nome (por exemplo, John)
  • Campo 2 ($2): idade (por exemplo, 25)
  • Campo 3 ($3): função (por exemplo, Engineer)

Se quisermos extrair apenas os nomes (a primeira coluna), devemos pedir ao awk que imprima $1.

No awk, $1, $2 e expressões semelhantes referenciam campos do registro atual. $0 representa a linha atual inteira. Essa notação de campos é um dos motivos pelos quais o awk é tão conciso para trabalhar com texto estruturado.

Execute o comando a seguir:

awk '{print $1}' data.txt

Saída:

John
Alice
Bob

Agora, salve essa saída em um arquivo:

awk '{print $1}' data.txt > output1.txt

Verifique o conteúdo do novo arquivo:

cat output1.txt

Entender a separação de campos

Agora vamos experimentar um formato de arquivo diferente: /etc/passwd. Esse arquivo armazena informações sobre contas de usuário.

Veja o início de passwd:

head -n 3 /etc/passwd

A saída será semelhante a: root:x:0:0:root:/root:/bin/bash

Observe que não há espaços. Em vez disso, os campos são separados por dois-pontos (:).

Se executarmos o comando padrão do awk nesse arquivo, ele não dividirá os campos corretamente, pois espera espaços por padrão.

Experimente:

awk '{print $1}' /etc/passwd > output2.txt
head -n 3 output2.txt

Você verá que o comando imprime a linha inteira. Como o awk não encontrou espaços, ele tratou a linha inteira como um único campo ($1).

Para corrigir isso, precisamos especificar um separador de campos personalizado.

Esta é uma lição importante para o processamento de texto no mundo real: a ferramenta só será tão eficaz quanto for sua compreensão do formato dos dados. Se você escolher o separador errado, as colunas que pensa estar extraindo não serão as colunas que o awk realmente identificará.

Usar um separador de campos personalizado (-F)

Para transformar os dados separados por dois-pontos em campos utilizáveis, usamos a opção -F.

O comando awk -F: instrui o awk a usar o caractere de dois-pontos como delimitador entre as colunas.

A opção -F altera a forma como o awk analisa cada linha antes de executar qualquer impressão ou lógica. Depois que a linha é dividida corretamente, as mesmas referências de campos, como $1 e $7, voltam a ter significado.

Agora podemos extrair campos específicos. No arquivo /etc/passwd:

  • O campo 1 é o nome de usuário.
  • O campo 7 é o shell.

Vamos extrair apenas o nome de usuário e o shell. Você pode imprimir vários campos separando-os por uma vírgula.

awk -F: '{print $1, $7}' /etc/passwd > output3.txt

Verifique o resultado:

head -n 5 output3.txt

A saída deve ser semelhante a: root /bin/bash

O awk dividiu corretamente a linha nos dois-pontos e imprimiu os campos primeiro e sétimo, separados por um espaço na saída.

Imprimir o último campo ($NF)

Às vezes, você não sabe exatamente quantas colunas uma linha contém, ou o número de colunas pode variar. No entanto, pode saber que os dados desejados estão sempre na última coluna.

O awk fornece uma variável interna chamada $NF (Number of Fields, número de campos).

  • NF armazena a quantidade de campos da linha atual.
  • $NF referencia o valor do último campo.

Isso é útil porque torna o comando menos dependente de números de colunas fixos. Quando a posição a partir do final é mais importante do que o número absoluto da coluna, NF e $NF costumam ser mais flexíveis.

Vamos extrair a última coluna de /etc/passwd usando $NF.

awk -F: '{print $NF}' /etc/passwd > output4.txt

Verifique a saída:

head -n 5 output4.txt

Novamente, ela deve corresponder ao shell, por exemplo, /bin/bash, assim como acontecia com $7, desde que a estrutura do arquivo seja consistente. O uso de $NF costuma ser mais robusto porque se adapta automaticamente ao final da linha.

Resumo

Neste laboratório, você aprendeu os fundamentos da análise de texto com awk:

  1. Extração de campos ($N): acessar colunas individuais de dados usando $1, $2 etc.
  2. Separadores de campos (-F): processar arquivos com delimitadores diferentes, como dois-pontos ou vírgulas, usando a opção -F.
  3. Último campo ($NF): acessar dinamicamente a coluna final de um registro.

Essas técnicas permitem transformar texto estruturado bruto em fluxos de dados limpos e utilizáveis para processamento posterior.