Contar registros que correspondem ao padrão com o Awk

12

Foi-me dito para fazer o last > lastloggedinque cria um arquivo que mostra o último logon das classes desde a última reinicialização do sistema, e agora me pedem para escrever um script do Awk chamado myawkque conta / determina quantas linhas lastloggedincontêm a string CFS264.

eu fiz grep -c CFS264 lastloggedin

TayshaunS
fonte
Você tem que usar awk? Caso contrário, você poderia apenas usar grep -c CFS264 lastloggedin | wc -l.
Axel
2
@Axel: grep -c (something) (something) | wc -lvai sempre produzir "1".
G-Man diz 'Reinstate Monica'

Respostas:

21

Para começar, você pode awkprocurar linhas em um arquivo que contenha uma string como esta:

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

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

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

Quanto à contagem, se você procurar "contador do awk", encontrará as perguntas e respostas sobre o SO: intitulado: usando o awk para contar nenhum registro . O método mostrado lá 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 se refere à lastsaída. Supondo que seja um nome de usuário, você pode restringir ainda mais o awkcomando para pesquisar apenas esse campo da seguinte forma:

$ awk '$1=="CFS264" { print $0 }' lastloggedin
slm
fonte
desculpe, cfs264 faz parte de um nome de usuário. Obrigado por dedicar seu tempo para me ajudar a descobrir isso, eu estava ficando bastante confuso e frustrado.
quer
@TayshaunS - np, de nada, obrigado pelo Q e boa sorte com awk.
slm
5

O exemplo a seguir conta os horários mencionados sem a necessidade do lastloggedinarquivo:

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

Se você insistir em usar ou for forçado a usar o lastloggedinarquivo, 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ário que contenham 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


PS:

Procure man awkmais dicas ... ;-)

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


fonte
2

Last can inclui logins de usuários de reinicializações anteriores. Como tal, o seguinte só imprime 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 - inicie da primeira linha até a primeira coluna ser 'reiniciar'.

DarkHeart
fonte