Чтобы добавить свой акцент, для
петли итерации по поводу слов слова . Если ваш файл:
one two
three four
, то это будет выпустить четыре строк:
for word in $(cat file); do echo "$word"; done
, чтобы повторить в строках файла, сделайте это:
while IFS= read -r line; do
# do something with "$line" <-- quoted almost always
done < file
-121--13946- Попробуйте следующий скрипт:
#!/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
Запустите его с
$ ./script file.log
Результат для входа с вашего вопроса выглядит как
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
Краткое объяснение:
-C
Опция GREP подсчитывает соответствующие строки -P
Включает Perl Regular Expreesion Syntax -O
совпадает только часть строк (? =
Конструкция - это так называемый позитивный вид (возьмите его как шаблон, но Не включайте в выходные данные) \ k
- позади утверждения (забрать весь шаблон, но выбросить от результата все зависит от этой точки) Остальное должно быть очевидно. Будьте в курсе, однако я Предполагалось, что нет пробелы в именах файлов!