Links de salto
-
Combine o texto usando expressões regulares
-
Selecione linhas por número de linha, comprimento, contagem de campo ou último campo
-
Compare e filtrar valores de campo numéricos
-
Captura faixas de linhas entre padrões correspondentes
-
Excluir entradas indesejadas ou duplicadas
-
Texto de reforma escolhendo colunas específicas
O comando AWK é uma ferramenta versátil de processamento de texto no Linux. Ele filtra e manipula arquivos usando padrões, condições e ações. Ele suporta uma ampla gama de cenários, tornando -o direto para extrair dados específicos de logs, arquivos de configuração ou qualquer arquivo de texto.
Aqui estão algumas maneiras comuns de filtrar o texto com awk. Eles incluem pesquisas regulares de expressão, seleção de linha e campo, filtragem numérica e muito mais.
Combine o texto usando expressões regulares
Embora Regex tenha uma curva de aprendizado notoriamente íngreme, é a faca do exército suíço da manipulação de texto. Quando você o usa com ferramentas como a AWK, você pode procurar padrões, de simples a complexo, em arquivos inteiros em milissegundos.
Vamos começar com a sintaxe básica:
awk '/pattern/ {print}' filename`
As barras para a frente dizem que você está usando uma expressão regular e os aparelhos encaracolados contêm a ação para executar em uma partida. Por exemplo, você pode imprimir todas as entradas de log contendo “erro” de um arquivo de log com isso:
awk '/error/ {print}' syslog.log
Essa linha pega todas as linhas que contêm o erro da palavra, mas Regex permite ir mais longe. Por exemplo, para encontrar linhas começando com informações ou aviso, use este comando:
awk '/^(INFO|WARN)/ {print}' syslog.log
Aqui, o tubo | Atua como um operador ou, e o cuidador ^ corresponde ao início de uma linha.
O que eu amo em Regex é que ela vai além das palavras exatas, permitindo que você use curingas para pesquisas mais complexas. Por exemplo, você pode encontrar endereços de email em um arquivo de texto com este padrão:
awk '/[a-zA-Z0-9]+@[a-zA-Z0-9]+.[a-zA-Z]+/ {print}' contacts.txt
Esse padrão corresponde às sequências de letras e números, seguidos por um símbolo @, mais letras e números, um ponto e, finalmente, mais letras. Embora não seja perfeito para todos os formatos de e -mail, ele captura os mais comuns.
Você também pode usar o operador TILDE (~) para uma correspondência mais precisa em campos específicos. Essa abordagem é muito eficaz para dados estruturados. Por exemplo, se você deseja procurar erros apenas no terceiro campo de cada linha, poderá usar isso:
awk '$3 ~ /ERROR/ {print}' system.log
Essa abordagem o torna mais preciso do que procurar toda a linha. Além disso, se a sensibilidade do caso for um problema, basta usar a função Tolower () como esta:
awk 'tolower($0) ~ /error/ {print}' mixed_case.log
Este comando converte cada linha em minúsculas antes da pesquisa, permitindo capturar erro, erro, erro e qualquer outra capitalização.
Selecione linhas por número de linha, comprimento, contagem de campo ou último campo
Às vezes, você precisa de linhas específicas com base em sua posição ou características, não no conteúdo deles. A AWK lida com esses cenários lindamente com suas variáveis embutidas que filtram linhas por posição ou estrutura. Essas variáveis internas incluem NR, Length (), NF e $ NF.
Vamos começar com a variável NR. Significa o número de registros (ou simplesmente o número da linha). Awk o incrementa para cada linha que lê. Você pode usar isso para pegar linhas ou intervalos específicos.
Para exibir as 10 primeiras linhas de um arquivo, use:
awk 'NR <=10 {print}' largefile.txt
Da mesma forma, para obter todas as linhas uniformes, use 2:
awk 'NR % 2 == 0 {print}' file.txt
Para intervalos, você pode combinar várias condições de NR com o operador && como este:
awk 'NR >= 50 && NR <= 100 {print}' file.txt
Isso imprime as linhas de 50 a 100. Você também pode combinar a função Length () com AWK ao lidar com arquivos com formatação inconsistente ou quando deseja filtrar linhas vazias.
Por exemplo, para contar os caracteres com a função Length () e, em seguida, exibir apenas linhas mais de 80 caracteres, use:
awk 'length($0) > 80 {print}' code.py
Agora, vamos falar sobre outra variável comumente usada, NF, que se refere à contagem de campo. Usando essa variável, o AWK divide automaticamente cada linha em campos com base em um delimitador (por padrão, espaços ou guias).
Por exemplo, para arquivos CSV ou dados estruturados, você pode usar a variável NF para contar campos (colunas). Você pode filtrar com base em quantos campos cada linha contém:
awk 'NF == 5 {print}' customer_data.csv
Isso mantém apenas linhas com exatamente 5 campos, ajudando você a identificar registros incompletos. Para fazer o oposto e imprimir apenas as linhas que não possuem exatamente 5 campos, use o! = Operador em vez de ==. Além disso, para imprimir linhas com pelo menos 5 campos (colunas), use o operador> =.
Enquanto a NF informa quantos campos existem, o $ NF fornece o valor do último campo. A variável $ NF representa o último campo em cada linha, independentemente de quantos campos existem. Isso é incrivelmente útil ao lidar com arquivos onde a contagem de colunas varia.
Pegue este comando:
awk '$NF == "COMPLETED" {print}' task_list.txt
Isso encontra todas as linhas que terminam com concluídas, mesmo que algumas linhas tenham 3 campos e outras tenham 7.
Você também pode combinar todas essas condições:
awk 'length($0) > 50 && NF >= 4 {print}' mixed_data.txt
Este comando imprime apenas as linhas que têm mais de 50 caracteres e contém pelo menos 4 campos. Ele garante que a saída exclua linhas curtas ou incompletas.
Compare e filtrar valores de campo numéricos
O AWK é inteligente o suficiente para tratar campos contendo números como números reais, não apenas texto. Isso significa que você pode executar comparações matemáticas sem funções especiais de conversão, abrindo um novo mundo de possibilidades de filtragem.
Agora, digamos que você tenha um CSV das pontuações dos alunos e deseja devolver apenas os alunos que pontuaram acima de 80 marcos. Você pode fazer isso com:
awk -F, '$2 > 80 {print $1, $2}' scores.csv
Aqui, usamos -f, para dizer ao AWK que os campos são separados por vírgulas. US $ 2 refere -se ao segundo campo ou coluna (a pontuação) e US $ 1 é o nome.
Ao trabalhar com arquivos de texto, as porcentagens podem causar problemas se o símbolo % estiver incluído em um campo. Você pode despojá -lo com Gsub ():
awk '{gsub(/%/, "", $4); if($4 > 75) print}' performance.txt
Este comando remove o símbolo % do quarto campo e verifica se o número restante excede 75.
Você também pode usar várias condições com operadores lógicos. Por exemplo, se você deseja extrair valores de vendas de um arquivo CSV entre US $ 500 e US $ 2000, execute:
awk -F, '$3 > 500 && $3 < 2000 {print}' sales.csv
Você pode combinar condições com o || (Ou) operador também. Por exemplo, para encontrar registros onde as vendas são muito altas ou muito baixas, use:
awk -F, '$3 > 5000 || $3 < 100 {print}' sales.csv
Além das comparações numéricas, você também pode usar várias condições para corresponder texto específico, verificando datas ou excluir registros indesejados.
Você também pode combinar && e ||. No entanto, parênteses são essenciais para controlar a lógica corretamente. Suponha que você queira encontrar contas ativas ou pendentes, mas apenas se o saldo exceder US $ 1000. Você escreveria:
awk -F, '($2 == "ACTIVE" || $2 == "PENDING") && $3 > 1000' accounts.csv
Sem parênteses, a precedência do operador mudaria o significado do filtro.
Captura faixas de linhas entre padrões correspondentes
A maioria dos usuários do Linux está familiarizada com o uso do Grep para capturar informações específicas. No entanto, o AWK também pode selecionar uma variedade de linhas, começando em uma linha que corresponde a um start_pattern e terminando com uma linha que corresponde a um end_pattern.
A sintaxe é elegantemente simples:
awk '/start_pattern/,/end_pattern/' filename
Isso captura a linha de partida, todas as linhas intermediárias e a linha final. Se você deseja excluir os próprios marcadores, pode usar uma abordagem baseada em bandeira como esta:
awk '/BEGIN/{flag=1; next} /END/{flag=0} flag' logfile.txt
Além disso, também podemos capturar blocos de erro completos que começam com o texto especificado e terminam com a próxima linha em branco.
awk '/ERROR:/,/^$/ {print}' application.log
Aqui, o AWK começará a imprimir linhas quando vir uma linha contendo “erro:” e continuará até encontrar a primeira linha em branco.
Excluir entradas indesejadas ou duplicadas
Os dados de limpeza geralmente significam remover o que você não deseja. O AWK fornece maneiras diretas de filtrar o ruído e remover dados redundantes.
O operador não (!) É sua ferramenta principal para exclusão. Você pode colocá -lo antes de qualquer padrão ou condição para inverter a partida, dizendo ao AWK para executar uma ação em todas as linhas que não correspondem.
Por exemplo, digamos que você queira excluir todas as mensagens que contêm depuração do arquivo de log do seu aplicativo. Use isto:
awk '!/DEBUG/' application.log
Este comando imprime todas as linhas do Application.log, a menos que contenha a palavra Debug.
Você também pode combinar isso com condições baseadas em campo, como, você pode visualizar todo o tráfego que não veio do seu endereço IP de monitoramento interno.
awk '$1 != "10.0.0.5"' access.log
Da mesma forma, outra ótima operação do AWK é filtrar comentários (linhas começando com #) e linhas vazias de um arquivo de configuração. Para fazer isso, use:
awk '!/^#/ && NF > 0 {print}' config.ini
Isso pula as linhas começando com # e também remove linhas vazias.
Você também pode remover duplicatas com base em um campo específico. Por exemplo, vamos considerar que você tem um arquivo CSV contact_list com três colunas: id, nome e email. Para manter apenas o primeiro registro para cada endereço de e -mail exclusivo (no terceiro campo), use:
awk '!seen[$3]++ {print}' contact_list.csv
Além disso, você pode excluir a exclusão insensível ao caso com a função Tolower ():
Texto de reforma escolhendo colunas específicas
Os dados brutos geralmente vêm em uma estrutura que você realmente não precisa, e o AWK facilita reorganizá -lo para algo mais útil. Você pode escolher colunas específicas, alterar a ordem deles ou até combiná -las em novos campos.
Por exemplo, se você deseja imprimir apenas a segunda e a quinta colunas de um arquivo, poderá usar:
awk -F, '{print $2, $5}' sales.csv
Se você deseja alterar a ordem das colunas, troque US $ 5 com US $ 2.
Por padrão, o AWK separa a saída com espaços, mas você pode inserir seu próprio separador, como um símbolo de tubo.
awk '{print $1 "|" $3}' data.txt
Ao trabalhar com arquivos CSV, a primeira linha geralmente é um cabeçalho. Você pode pular com NR> 1 e reorganizar as colunas para mostrar o email seguido pelo nome.
awk -F, 'NR > 1 {print $3, "->", $1, $2}' contacts.csv
Você também pode combinar campos para criar novos, como ingressar no primeiro e sobrenome em um nome completo antes de imprimir o email.
awk -F, '{print $1 " " $2, $3}' contacts.csv
Por fim, se você deseja que a saída pareça mais clara, poderá adicionar seu próprio cabeçalho antes dos dados usando um bloco de início.
awk 'BEGIN {print "Name,Email"} {print $1 "," $2}' data.txt
Esses exemplos simples são suficientes para começar a reformatando o texto em um layout que se adapta melhor às suas necessidades.
Lembre -se, o AWK se destaca no processamento de texto estruturado, qualquer coisa com padrões consistentes ou separações de campo. Quanto mais regular seu formato de dados, mais poderoso awk se torna. E quando você combina essas técnicas de filtragem com outras ferramentas do Linux através de tubos, você cria fluxos de trabalho de processamento de texto incrivelmente eficientes.