Como usar o comando awk no Linux

No Linux,awk é um dínamo de manipulação de texto de linha de comando, bem como uma poderosa linguagem de script. Aqui está uma introdução a alguns de seus recursos mais interessantes.

Como awk ganhou esse nome

Oawk command foi nomeado usando as iniciais das três pessoas que escreveram a versão original em 1977: Alfred Aho, Peter Weinberger e Brian Kernighan. Esses três homens eram do lendário panteão Unix da AT&T Bell Laboratories. Com a contribuição de muitos outros desde então, awk continuou a evoluir.

É uma linguagem de script completa, bem como um kit de ferramentas de manipulação de texto completo para a linha de comando. Se este artigo abrir seu apetite, você pode verificar todos os detalhes sobreawk e sua funcionalidade.

Regras, padrões e ações

awk trabalha em programas que contêm regras compostas de padrões e ações. A ação é executada no texto que corresponde ao padrão. Os padrões são colocados entre chaves ({}) Juntos, um padrão e uma ação formam uma regra. O todo awk programa está entre aspas simples (').

Vamos dar uma olhada no tipo mais simples de awk programa. Não tem padrão, portanto, corresponde a cada linha de texto inserida nele. Isso significa que a ação é executada em todas as linhas. Vamos usá-lo na saída do quem comando.

Aqui está o resultado padrão de quem:

quem

Talvez não precisemos de todas essas informações, mas, sim, apenas queremos ver os nomes nas contas. Podemos canalizar a saída de quem para dentro awk, e então diga awk para imprimir apenas o primeiro campo.

Por padrão, awk considera um campo como uma sequência de caracteres cercada por espaços em branco, o início de uma linha ou o final de uma linha. Os campos são identificados por um cifrão ($) e um número. Então,$1 representa o primeiro campo, que usaremos com o impressão ação para imprimir o primeiro campo.

Nós digitamos o seguinte:

quem | awk '{print $ 1}'

awk imprime o primeiro campo e descarta o resto da linha.

Podemos imprimir quantos campos quisermos. Se adicionarmos uma vírgula como separador,awk imprime um espaço entre cada campo.

Digitamos o seguinte para imprimir também a hora em que a pessoa se conectou (campo quatro):

quem | awk '{print $ 1, $ 4}'

Existem alguns identificadores de campo especiais. Eles representam toda a linha de texto e o último campo na linha de texto:

  • $0: Representa toda a linha de texto.
  • $1: Representa o primeiro campo.
  • $2: Representa o segundo campo.
  • $7: Representa o sétimo campo.
  • $45: Representa o 45º campo.
  • $ NF: Significa “número de campos” e representa o último campo.

Vamos digitar o seguinte para abrir um pequeno arquivo de texto que contém uma pequena citação atribuída a Dennis Ritchie:

gato dennis_ritchie.txt

Nós queremosawk para imprimir o primeiro, segundo e último campo da cotação. Observe que, embora esteja enrolado na janela do terminal, é apenas uma única linha de texto.

Nós digitamos o seguinte comando:

awk '{print $ 1, $ 2, $ NF}' dennis_ritchie.txt

Não conhecemos essa "simplicidade". é o 18º campo na linha de texto, e não nos importamos. O que sabemos é que é o último campo e podemos usar $ NF para obter seu valor. O ponto final é apenas considerado mais um caractere do corpo do campo.

Adicionando Separadores de Campo de Saída

Você também pode dizer awk para imprimir um determinado caractere entre os campos em vez do caractere de espaço padrão. A saída padrão dodata comando é ligeiramente peculiar porque o tempo é colocado bem no meio dele. No entanto, podemos digitar o seguinte e usar awk para extrair os campos que queremos:

data
data | awk '{print $ 2, $ 3, $ 6}'

Vamos usar o OFS (separador de campo de saída) variável para colocar um separador entre o mês, dia e ano. Observe que a seguir colocamos o comando entre aspas simples ('), não colchetes ({}):

data | awk 'OFS = "/" {imprimir $ 2, $ 3, $ 6}'
data | awk 'OFS = "-" {imprimir $ 2, $ 3, $ 6}'

As regras BEGIN e END

UMA COMEÇAR regra é executada uma vez antes de iniciar qualquer processamento de texto. Na verdade, é executado antes awk até lê qualquer texto. A FIM regra é executada após a conclusão de todo o processamento. Você pode ter vários COMEÇAR eFIM regras, e eles serão executados em ordem.

Para o nosso exemplo de COMEÇAR regra, imprimiremos a citação completa do dennis_ritchie.txt arquivo que usamos anteriormente com um título acima dele.

Para fazer isso, digitamos este comando:

awk 'BEGIN {print "Dennis Ritchie"} {print $ 0}' dennis_ritchie.txt

Note o COMEÇAR regra tem seu próprio conjunto de ações dentro de seu próprio conjunto de chaves ({}).

Podemos usar essa mesma técnica com o comando que usamos anteriormente para canalizar a saída de quem para dentro awk. Para fazer isso, digitamos o seguinte:

quem | awk 'BEGIN {print "Sessões Ativas"} {print $ 1, $ 4}'

Separadores de campo de entrada

Se você quiser awk para trabalhar com texto que não usa espaços em branco para separar campos, você deve informar qual caractere o texto usa como separador de campo. Por exemplo, o / etc / passwd arquivo usa dois pontos (:) para separar campos.

Usaremos esse arquivo e o -F (string separadora) opção para contar awk para usar o cólon (:) como separador. Nós digitamos o seguinte para contar awk para imprimir o nome da conta do usuário e a pasta inicial:

awk -F: '{print $ 1, $ 6}' / etc / passwd

A saída contém o nome da conta do usuário (ou nome do aplicativo ou daemon) e a pasta pessoal (ou a localização do aplicativo).

Adicionando Padrões

Se tudo o que estamos interessados ​​são contas de usuários regulares, podemos incluir um padrão com nossa ação de impressão para filtrar todas as outras entradas. Como os números de ID do usuário são iguais ou maiores que 1.000, podemos basear nosso filtro nessas informações.

Nós digitamos o seguinte para executar nossa ação de impressão apenas quando o terceiro campo ($3) contém um valor igual ou superior a 1.000:

awk -F: '$ 3> = 1000 {print $ 1, $ 6}' / etc / passwd

O padrão deve preceder imediatamente a ação com a qual está associado.

Podemos usar o COMEÇAR regra para fornecer um título para nosso pequeno relatório. Nós digitamos o seguinte, usando o (\ n) notação para inserir um caractere de nova linha na string de título:

awk -F: 'BEGIN {print "Contas de usuário \ n -------------"} $ 3> = 1000 {print $ 1, $ 6}' / etc / passwd

Os padrões são expressões regulares completas e são uma das glórias de awk.

Digamos que queremos ver os identificadores exclusivos universalmente (UUIDs) dos sistemas de arquivos montados. Se pesquisarmos no / etc / fstab arquivo para ocorrências da string "UUID", ele deve retornar essa informação para nós.

Usamos o padrão de pesquisa “/ UUID /” em nosso comando:

awk '/ UUID / {print $ 0}' / etc / fstab

Ele encontra todas as ocorrências de “UUID” e imprime essas linhas. Na verdade, teríamos obtido o mesmo resultado sem o impressão ação porque a ação padrão imprime toda a linha de texto. Para maior clareza, porém, muitas vezes é útil ser explícito. Ao examinar um script ou arquivo de histórico, você ficará feliz por ter deixado pistas para si mesmo.

A primeira linha encontrada foi uma linha de comentário e, embora a string "UUID" esteja no meio dela, awk ainda encontrei. Podemos ajustar a expressão regular e dizer awk para processar apenas as linhas que começam com “UUID”. Para fazer isso, digitamos o seguinte, que inclui o token de início de linha (^):

awk '/ ^ UUID / {print $ 0}' / etc / fstab

Isso é melhor! Agora, vemos apenas instruções de montagem genuínas. Para refinar ainda mais a saída, digitamos o seguinte e restringimos a exibição ao primeiro campo:

awk '/ ^ UUID / {print $ 1}' / etc / fstab

Se tivéssemos vários sistemas de arquivos montados nesta máquina, obteríamos uma tabela organizada de seus UUIDs.

Funções integradas

awk tem muitas funções que você pode chamar e usar em seus próprios programas, tanto na linha de comando quanto em scripts. Se você cavar um pouco, vai achar que é muito frutífero.

Para demonstrar a técnica geral para chamar uma função, veremos algumas numéricas. Por exemplo, o seguinte imprime a raiz quadrada de 625:

awk 'BEGIN {print sqrt (625)}'

Este comando imprime o arco tangente de 0 (zero) e -1 (que passa a ser a constante matemática, pi):

awk 'BEGIN {print atan2 (0, -1)}'

No comando a seguir, modificamos o resultado do atan2 () função antes de imprimi-lo:

awk 'BEGIN {print atan2 (0, -1) * 100}'

As funções podem aceitar expressões como parâmetros. Por exemplo, aqui está uma forma complicada de pedir a raiz quadrada de 25:

awk 'BEGIN {print sqrt ((2 + 3) * 5)}'

Scripts de awk

Se sua linha de comando ficar complicada ou se você desenvolver uma rotina que sabe que vai querer usar novamente, você pode transferir seu awk comando em um script.

Em nosso script de exemplo, vamos fazer tudo o seguinte:

  • Diga ao shell qual executável usar para executar o script.
  • Preparar awk para usar o FS variável separadora de campo para ler o texto de entrada com campos separados por dois pontos (:).
  • Use o OFS separador de campo de saída para dizer awk usar dois pontos (:) para separar campos na saída.
  • Defina um contador para 0 (zero).
  • Defina o segundo campo de cada linha de texto com um valor em branco (é sempre um "x", por isso não precisamos vê-lo).
  • Imprima a linha com o segundo campo modificado.
  • Aumente o contador.
  • Imprima o valor do contador.

Nosso script é mostrado abaixo.

O COMEÇAR regra realiza as etapas preparatórias, enquanto aFIM regra exibe o valor do contador. A regra do meio (que não tem nome, nem padrão para corresponder a todas as linhas) modifica o segundo campo, imprime a linha e incrementa o contador.

A primeira linha do script informa ao shell qual executável usar (awk, em nosso exemplo) para executar o script. Também passa o -f (nome do arquivo) opção para awk, que informa que o texto que será processado virá de um arquivo. Passaremos o nome do arquivo para o script quando o executarmos.

Incluímos o script abaixo como texto para que você possa recortar e colar:

#! / usr / bin / awk -f BEGIN {# definir os separadores de campo de entrada e saída FS = ":" OFS = ":" # zero o contador de contas contas = 0} {# definir o campo 2 para nada $ 2 = "" # imprimir a linha inteira imprimir $ 0 # contar outras contas de conta ++} END {# imprimir os resultados imprimir contas "contas. \ n"}

Salve isso em um arquivo chamado omit.awk. Para tornar o script executável, digitamos o seguinte usando chmod:

chmod + x omit.awk

Agora, vamos executá-lo e passar o / etc / passwd arquivo para o script. Este é o arquivoawk processará para nós, usando as regras do script:

./omit.awk / etc / passwd

O arquivo é processado e cada linha é exibida, conforme mostrado abaixo.

As entradas “x” no segundo campo foram removidas, mas observe que os separadores de campo ainda estão presentes. As linhas são contadas e o total é fornecido na parte inferior da saída.

awk não significa estranho

awk não significa estranho; significa elegância. Ele foi descrito como um filtro de processamento e um redator de relatórios. Mais precisamente, é ambos, ou melhor, uma ferramenta que você pode usar para ambas as tarefas. Em apenas algumas linhas,awk atinge o que requer codificação extensiva em uma linguagem tradicional.

Esse poder é aproveitado pelo conceito simples de regras que contêm padrões, que selecionam o texto a processar e ações que definem o processamento.


$config[zx-auto] not found$config[zx-overlay] not found