Como grep os logs para uma lista de padrões e fazer um relatório com isso?

1

Eu tenho um executável C ++ que verifica alguns dos meus arquivos e esses arquivos tem algum ID de usuário. Após a conclusão da verificação, gera abaixo do arquivo de log (abc.log) como este -

INFO [0x7faff2b32a00] (/home/david/abc/golden/mmap/mapper_check/mapper_check.cc:110) - checking file: "p1_weekly_1980_32_200003_5.data" with path: "/database/batch/p1_snapshot/p1_weekly_1980_32_200003_5.data"
WARN [0x7faff2b32a00] (/home/david/abc/golden/mmap/KKLFileMgr.cc:389) - Failed to upsert attribute for uuid 45576752 with value badge_leaf_cat and status -2
WARN [0x7faff2b32a00] (/home/david/abc/golden/mmap/KKLFileMgr.cc:389) - Failed to upsert attribute for uuid 870206432 with value badge_leaf_cat and status -2
INFO [0x7faff2b32a00] (/home/david/abc/golden/mmap/mapper_check/mapper_check.cc:120) - golden_file: /database/batch/p1_snapshot//p1_weekly_1980_32_200003_5.data is valid
INFO [0x7faff2b32a00] (/home/david/abc/golden/mmap/mapper_check/mapper_check.cc:110) - checking file: "p1_weekly_1980_13_200003_5.data" with path: "/database/batch/p1_snapshot/p1_weekly_1980_13_200003_5.data"
WARN [0x7faff2b32a00] (/home/david/abc/golden/mmap/KKLFileMgr.cc:389) - Failed to upsert attribute for uuid 876269533 with value badge_leaf_cat and status -2
WARN [0x7faff2b32a00] (/home/david/abc/golden/mmap/KKLFileMgr.cc:389) - Failed to upsert attribute for uuid 17256973 with value badge_leaf_cat and status -2
WARN [0x7faff2b32a00] (/home/david/abc/golden/mmap/KKLFileMgr.cc:389) - Failed to upsert attribute for uuid 830173693 with value badge_leaf_cat and status -2
INFO [0x7faff2b32a00] (/home/david/abc/golden/mmap/mapper_check/mapper_check.cc:120) - golden_file: /database/batch/p1_snapshot//p1_weekly_1980_13_200003_5.data is valid
INFO [0x7faff2b32a00] (/home/david/abc/golden/mmap/mapper_check/mapper_check.cc:110) - checking file: "p1_weekly_1980_0_200003_5.data" with path: "/database/batch/p1_snapshot/p1_weekly_1980_0_200003_5.data"
ERROR [0x7faff2b32a00] (/home/david/abc/golden/mmap/KKLFileMgrUtil.cc:493) - failed reading user id: 18446744073135142816 num attributes: 0 seeing 1 bad records from 365 records
ERROR [0x7faff2b32a00] (/home/david/abc/golden/mmap/KKLFileMgrUtil.cc:493) - failed reading user id: 18446744073698151136 num attributes: 0 seeing 2 bad records from 595 records
ERROR [0x7faff2b32a00] (/home/david/abc/golden/mmap/KKLFileMgrUtil.cc:493) - failed reading user id: 18446744072929739296 num attributes: 0 seeing 3 bad records from 1214 records
ERROR [0x7faff2b32a00] (/home/david/abc/golden/mmap/mapper_check/mapper_check.cc:117) - golden_file: /database/batch/p1_snapshot//p1_weekly_1980_0_200003_5.data is corrupt

Agora eu preciso fazer o grep nos logs acima e descobrir quantos arquivos foram verificados, quantos ids de usuários falharam e quais arquivos estão corrompidos.

  • Para quantos arquivos foram verificados, preciso procurar checking file palavras em cada linha e, com base nisso, aumentar a contagem do número de arquivos verificados.
  • Para quantos IDs de usuários únicos falharam, preciso procurar por failed reading user id palavras em uma linha e base para aumentar a contagem e fornecer a lista de ids de usuários que falharam.
  • Se algum ID de usuário falhou, significa que o arquivo estará corrompido e que estava segurando esse ID de usuário, portanto, preciso procurar is corrupt word em cada linha e localizar o nome do arquivo que está corrompido. Em geral, esse arquivo database/batch/p1_snapshot//p1_weekly_1980_0_200003_5.data está corrompido.

E abaixo está a resposta que eu queria ver após a verificação dos registros acima -

Total Number of Files Scanned - 1000
Total Number of Unique User ID failed - 10000
Total Number of Files Corrupted - 5

List of Unique User Id's which are corrupt - 
UserId-A
UserId-B

Files which are corrupted - 
FileName-A
FileName-B

Como eu iria em frente e obteria o resultado acima depois de varrer os logs usando o grep?

    
por david 28.10.2014 / 00:02

1 resposta

2

Experimente o seguinte script:

#!/bin/bash

logfile="$1"

nfiles=$(grep -c 'checking file' "$logfile")
failed_userid=($(grep -oP 'failed reading user id: \K[^ ]*' "$logfile"))
corrupted_files=($(grep -oP '[^ ]*(?= is corrupt)' "$logfile"))


echo "Total Number of Files Scanned - $nfiles"
echo "Total Number of Unique User ID failed - ${#failed_userid[@]}"
echo "Total Number of Files Corrupted - ${#corrupted_files[@]}"
echo

echo "List of Unique User Id's which are corrupt - "
for uid in "${failed_userid[@]}"; do
   echo "$uid"
done

echo

echo "Files which are corrupted - "
for corf in "${corrupted_files[@]}"; do
   echo "$corf"
done

Execute com

$ ./script file.log

O resultado da entrada da sua pergunta parece

Total Number of Files Scanned - 3
Total Number of Unique User ID failed - 3
Total Number of Files Corrupted - 1

List of Unique User Id's which are corrupt - 
18446744073135142816
18446744073698151136
18446744072929739296

Files which are corrupted - 
/database/batch/p1_snapshot//p1_weekly_1980_0_200003_5.data

Uma breve explicação:

  • A opção -c do grep conta as linhas correspondentes
  • -P ativa a sintaxe de expresions regulares do perl
  • -o corresponde apenas a parte das linhas
  • (?= construct é o chamado look-ahead positivo (pegue-o como padrão, mas não inclua na saída)
  • \K é asserção visual (pegue todo o padrão, mas jogue fora do resultado até este ponto)

O resto deve ser óbvio. Esteja ciente, entretanto, de que eu assumi que não há espaços em branco nos nomes dos arquivos!

    
por 28.10.2014 / 00:33