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!