En 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.
RELACIONADO: 10 comandos básicos do Linux para iniciantes
Como ganhou o nome dele
a awk
O comando 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 da lendária NO&T Bell Labs Pantheon Unix. Com contribuições 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 esta postagem abrir seu apetite, poderia olhe para cada detalhe sobre awk
e sua funcionalidade.
Regras, padrões e ações
awk
funciona em programas que contêm regras compostas por padrões e ações. A ação é executada no texto que corresponde ao padrão. Os padrões são colocados entre colchetes ({}
). Juntos, um padrão e uma ação formam uma regra. A totalidade awk
O programa está entre aspas simples ('
).
Vamos dar uma olhada no tipo mais simples de awk
Programa. Não tem padrão, então ele corresponde a todas as linhas de texto inseridas nele. Isso significa que a ação ocorre em todas as linhas. Nós vamos use-o na saída de a who
comando.
Aqui está a saída padrão de who
:
quem
Podemos não precisar de todas essas informações, mas sim, só queremos ver os nomes nas contas. Podemos canalizar a saída de who
dentro de awk
e depois diga awk
imprimir apenas o primeiro campo.
Por padrão, awk
considera um campo como uma sequência de caracteres cercada por um espaço em branco, o início de uma linha ou o fim de uma linha. Os campos são identificados com um cifrão ($
) e um número. Então, $1
representa o primeiro campo, o que vamos usar com isso print
ação para imprimir o primeiro campo.
Nós escrevemos o seguinte:
quem | awk '{imprimir $1}'
awk
imprima o primeiro campo e descarte o resto da linha.
Podemos imprimir quantos campos quisermos. Se adicionarmos uma vírgula como separador, awk
imprima um espaço entre cada campo.
Escrevemos o seguinte para também imprimir a hora em que a pessoa logou (campo quatro):
quem | awk '{imprimir $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 campo 45.
- $ NF: Significa “número de campos” y representa o último campo.
Vamos escrever o seguinte para abrir um pequeno arquivo de texto contendo uma pequena citação atribuída a Dennis Ritchie:
gato dennis_ritchie.txt
Nós queremos awk
imprimir o primeiro, segundo e último campo da citação. tenha em conta que, mesmo quando embrulhado na janela do terminal, é apenas uma linha de texto.
Nós escrevemos o seguinte comando:
awk '{imprimir $ 1, $ 2, $ NF}'dennis_ritchie.txt
nós não sabemos disso “simplicidade”. é o campo numérico 18 na linha de texto, e nós não nos importamos. O que sabemos é que é o último campo e podemos usar $NF
para obter seu valor. O ponto final é considerado apenas mais um caractere no corpo do campo.
Adicionar separadores de campo de saída
Você também pode dizer awk
para imprimir um caractere particular entre os campos em vez do caractere de espaço padrão. A saída padrão do date
o comando é um pouco peculiar porque o tempo está bem no meio. Apesar disto, podemos escrever o seguinte e usar awk
para extrair os campos que queremos:
encontro
encontro | awk '{imprimir $2,$3,$6}'
Nós vamos usar o OFS
(separador de campo de saída) variável para colocar um separador entre o mês, o dia e o ano. Observe que colocamos o comando entre aspas simples abaixo ('
), sem chaves ({}
):
encontro | awk 'OFS ="https://www.systempeaker.com/" {imprimir $ 2, $ 3, $ 6}'
encontro | awk 'OFS ="-" {imprimir $ 2, $ 3, $ 6}'
As regras BEGIN e END
UMA BEGIN
A regra é executada uma vez antes do início do processamento de texto. Na realidade, corre antes awk
até leia qualquer texto. uma END
A regra é executada após todo o processamento ser concluído. Você pode ter vários BEGIN
e END
as regras, e eles vão funcionar em ordem.
Para nosso exemplo de BEGIN
regra, vamos imprimir a citação completa do dennis_ritchie.txt
arquivo que usamos anteriormente com um título no topo.
Para faze-lo, nós escrevemos este comando:
awk 'BEGIN {imprimir "Dennis Ritchie"} {imprimir $0}'dennis_ritchie.txt
Note o BEGIN
A 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 who
dentro de awk
. Para faze-lo, nós escrevemos o seguinte:
quem | awk 'BEGIN {imprimir "Sessões ativas"} {imprimir $1,$4}'
Separadores de campo de entrada
Se você fingir awk
trabalhar com texto que não usa espaços em branco para separar campos, deve informar qual caractere o texto usa como separador de campo. Como um exemplo, a /etc/passwd
o arquivo usa dois-pontos (:
) para separar campos.
Usaremos esse arquivo e o -F
(cadeia de separação) opção de dizer awk
use o cólon:
) como separador. Escrevemos o seguinte para contar awk
para imprimir o nome da conta do usuário e pasta pessoal:
awk -F: '{imprimir $1,$6}'/ etc / passwd
A saída contém o nome da conta do usuário (ou o nome do aplicativo ou daemon) e a pasta pessoal (ou a localização do aplicativo).
Adicionando padrões
Se a única coisa que nos interessa são as contas de usuário usuais, podemos incluir um padrão com nossa ação de impressão para filtrar todas as outras entradas. Devido a que ID do usuário Se os números forem iguais ou maiores que 1.000, podemos basear nosso filtro nessas informações.
Escrevemos o seguinte para executar nossa ação de impressão apenas quando o terceiro campo ($3
) contém um valor de 1000 o mais:
awk -F: '$ 3 >= 1000 {imprimir $1,$6}'/ etc / passwd
O padrão deve preceder imediatamente a ação à qual está relacionado.
Podemos usar o BEGIN
regra para fornecer um título ao nosso pequeno relatório. Nós escrevemos o seguinte, usando o (n
) notação para inserir um caractere de nova linha na string do título:
awk -F: 'COMEÇAR {imprimir "Contas de usuário -------------"} $3 >= 1000 {imprimir $1,$6}'/ etc / passwd
Os padrões estão completos expressões regulares, e eles são uma das glórias de awk
.
Digamos que queremos ver os identificadores únicos universais (UUID) de sistemas de arquivos montados. Se pesquisarmos no /etc/fstab
arquivo para ocorrências de string “UUID”, você deve retornar essa informação para nós.
Usamos o padrão de pesquisa "/ UUID /" em nosso comando:
awk '/ UUID / {imprimir $0}'/ etc / fstab
Encontre todas as ocorrências de "UUID" e imprima essas linhas. Na realidade, teríamos obtido o mesmo resultado sem o print
ação porque a ação padrão imprime toda a linha de texto. Apesar disto, para mais clareza, muitas vezes é útil ser explícito. Ao revisar um script ou seu arquivo, você ficará feliz por termos deixado pistas para você.
A primeira linha encontrada foi uma linha de comentário e, mesmo quando a cadeia “UUID” está no meio, awk
Eu ainda encontrei. Podemos modificar o regex e dizer awk
para processar apenas as linhas que começam com “UUID”. Para faze-lo, escrevemos o seguinte, que inclui o token de início de linha (^
):
awk '/ ^ UUID / {imprimir $0}'/ etc / fstab
Isso é melhor! Agora, nós apenas vemos instruções de montagem genuínas. Para refinar ainda mais a saída, escrevemos o seguinte e restringimos a exibição ao primeiro campo:
awk '/ ^ UUID / {imprimir $1}'/ etc / fstab
Se tivéssemos vários sistemas de arquivos montados nesta máquina, obteríamos uma tabela ordenada de seus UUIDs.
Funções integradas
awk
tenho muitas funções que você pode chamar e usar em seus próprios programas, tanto na linha de comando quanto em scripts. Se você fizer uma pequena pesquisa, você vai achar que é muito frutífero.
Para demonstrar a técnica geral para chamar uma função, veremos alguns números. Como um exemplo, o seguinte imprime a raiz quadrada de 625:
awk 'BEGIN { imprimir sqrt(625)}'
Este comando imprime o arco tangente de 0 (zero) e -1 (que acaba sendo a constante matemática, pi):
awk 'BEGIN {imprimir atan2(0, -1)}'
No seguinte comando, nós modificamos o resultado do atan2()
função antes de imprimir:
awk 'BEGIN {imprimir atan2(0, -1)*100}'
Funções podem aceitar expressões como parâmetros. Como um exemplo, aqui está uma maneira complicada de pedir a raiz quadrada de 25:
awk 'BEGIN { imprimir sqrt((2+3)*5)}'
scripts awk
Se sua linha de comando ficar complicada ou você desenvolver uma rotina que você sabe que vai querer usar novamente, você pode transferir seu awk
comando em um script.
Em nosso script de exemplo, nós faremos tudo o seguinte:
- Diga ao shell qual executável usar para executar o script.
- Configurar
awk
use oFS
variável de separação de campo para ler o texto de entrada com campos separados por dois pontos (:
). - Use o
OFS
separador de campo de saída para contarawk
use dois pontos:
) separar campos na saída. - Defina um contador em 0 (zero).
- Defina o segundo campo de cada linha de texto com um valor em branco (é sempre um “x”, então não é necessário que vejamos).
- Imprime a linha com o segundo campo modificado.
- Aumente o contador.
- Imprimir o valor do contador.
Nosso script é mostrado abaixo.
a BEGIN
governante realiza etapas preparatórias, Entretanto ele END
A régua mostra o valor do contador. A regra do meio (que não tem nome ou padrão, então corresponde a todas as linhas) modifique o segundo campo, imprimir a linha e incrementar o contador.
A primeira linha do script diz 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 a ser processado virá de um arquivo. Passaremos o nome do arquivo para o script quando o executarmos.
Incluímos o seguinte script como texto para que você possa recortar e colar:
#!/usr/bin/awk -f BEGIN { # set the input and output field separators FS=":" OFS=":" # zero the accounts counter accounts=0 } { # definir campo 2 to nothing $2="" # print the entire line print $0 # count another account accounts++ } FIM { # print the results print accounts " contas.n" }
Salve isso em um arquivo chamado omit.awk
. Para tornar o script executávelmim, escrevemos o seguinte usando chmod
:
chmod +x omit.awk
Agora, vamos executá-lo e passar o /etc/passwd
arquivo para script. Este é o arquivo awk
irá processar para nós, usando as regras dentro do script:
./omit.awk / etc / passwd
O arquivo é processado e cada linha é exibida, como é mostrado a seguir.
As entradas foram removidas “x” no segundo campo, mas observe que os separadores de campo ainda estão presentes. As linhas são contadas e o total é dado na parte inferior da saída.
awk não significa estranho
awk
não significa desconfortável; é sinônimo de elegância. Ele foi descrito como um filtro de processamento e redator de relatórios. Mais precisamente, são ambos ou, melhor dito, uma ferramenta que você pode usar para ambas as tarefas. Em apenas algumas linhas, awk
alcança o que a codificação extensiva em uma linguagem tradicional precisa.
Esse poder é aproveitado pelo conceito simples de regras contendo padrões., que selecionam o texto a ser processado e ações que definem o processamento.