Contagem de registros que correspondem ao padrão com Awk

8

Então me disseram para fazer o last > lastloggedin , que cria um arquivo que mostra o último login das classes desde a última reinicialização do sistema, e agora me pedem para escrever um script Awk chamado myawk que conta / determina quantas linhas de lastloggedin contêm a string CFS264 .

Eu fiz grep -c CFS264 lastloggedin

    
por TayshaunS 21.10.2014 / 02:19

3 respostas

15

Para começar, você pode usar awk para procurar linhas em um arquivo que contenha uma string assim:

$ awk '/CFS264/ { .... }' lastloggedin

Os bits no { .... } serão os comandos necessários para calcular o número de linhas com essa string. Para confirmar que o acima está funcionando, você pode usar um print $0 para simplesmente imprimir as linhas que contêm a string de busca.

$ awk '/CFS264/ { print $0 }' lastloggedin

Quanto à contagem, se você pesquisar por "contador de awk", encontrará este SO Q & A intitulado: usando o awk para contar os registros . O método mostrado ali seria suficiente para o que você descreve:

$ awk '/CFS264/ {count++} END{print count}' lastloggedin

Exemplo

$ last > lastloggedin

$ awk '/slm/ {count++} END {print count}' lastloggedin 
758

$ grep slm lastloggedin  | wc -l
758

$ grep -c slm lastloggedin
758

NOTA: Você não diz a qual campo o CFS264 pertence na saída last . Supondo que seja um nome de usuário, você pode restringir ainda mais o comando awk para pesquisar somente esse campo da seguinte forma:

$ awk '$1=="CFS264" { print $0 }' lastloggedin
    
por 21.10.2014 / 02:27
4

O exemplo a seguir conta as vezes em que sou mencionado sem precisar do arquivo lastloggedin :

$ last | awk '$1=="yeti" { ++count } END { print count }' 
106

Se você insistir em usar ou for forçado a usar o arquivo lastloggedin , poderá fazê-lo desta maneira:

$ last > lastloggedin
$ awk '$1=="yeti" { ++count } END { print count }' lastloggedin
106

Use $1~/some_chars/ para obter todos os nomes de usuários contendo os caracteres fornecidos ou $1~/^prefix/ para corresponder apenas aos nomes que começam com prefix :

$ last | awk '$1~/et/ { ++count } END { print count }'
106
$ last | awk '$1~/^ye/ { ++count } END { print count }'
106

P.S .:

Analise man awk para mais dicas ...; -)

awk é muito gratificante: você pode fazer muitas coisas depois de um tempo muito curto de aprendizado ...

    
por 21.10.2014 / 02:32
1

O último pode incluir logins de usuários de reinicializações anteriores. Como tal, o seguinte apenas imprimirá os usuários desde a última reinicialização:

last | awk 'NR==1,$1=="reboot"{if ($1 ~ /cfs264/ ) { count+=1; }}END{ print count; }'

A primeira parte do comando awk especifica um intervalo - comece na primeira linha até a primeira coluna ser 'reboot'.

    
por 21.10.2014 / 02:55