Para sua pergunta atualizada:
awk '
/"rarely_used_module"/ && /OUT:/ { nc[$NF]++ ; c++ }
END {
printf "Number of license checkouts for rarely_used_module: %d\n", c
for (i in nc) printf "User: %s (%d)\n", i, nc[i]
}
' logfile.txt
cria esta saída:
Number of license checkouts for rarely_used_module: 4
User: [email protected] (2)
User: [email protected] (2)
Aqui está um exemplo de como se pode abordar essas tarefas usando awk
:
awk '
BEGIN { SUBSEP = ", " ; OFS = ": " }
{ m[$(NF-1)]++ }
{ n[$(NF-1)] = n[$(NF-1)] " " $NF }
{ nc[$(NF-1),$NF]++ }
END {
print "\n=== count modules:"
for (i in m) print i, m[i]
print "\n=== collect names using modules:"
for (i in n) print i, n[i]
print "\n=== count names using modules:"
for (i in nc) print i, nc[i]
}
' logfile.txt
Explicação:
-
{ m[$(NF-1)]++ }
- incrementa o contador para o segundo último campo (módulos) nos dados de entrada -
{ n[$(NF-1)] = n[$(NF-1)] " " $NF }
- concatena o último campo (nomes) para cada chave (módulos) -
{ nc[$(NF-1),$NF]++ }
- incrementa o contador para uma tupla-chave de (nome, módulo)
Com seus dados de exemplo, ele produziria essa saída:
=== count modules:
"rarely_used_module": 1
"different_module": 2
"certain_module": 3
=== collect names using modules:
"rarely_used_module": [email protected]
"different_module": [email protected] [email protected]
"certain_module": [email protected] [email protected] [email protected]
=== count names using modules:
"different_module", [email protected]: 1
"different_module", [email protected]: 1
"certain_module", [email protected]: 2
"rarely_used_module", [email protected]: 1
"certain_module", [email protected]: 1