CCCPaste

62d0d86b04ce9

#!/bin/bash
# ==================================================================
# Проверка дублей отправок чеков в ФНС по логам redis-cli MONITOR
# Linux / CentOS версия — ультрабыстрая, потоковая, без Python
# Работает с файлами любого размера (10 МБ → 200 ГБ) и с пайпом
# ==================================================================

echo
echo "Поиск дублей отправок в ФНС (tax_sent_* SETEX \"93600\" \"sent\") ..."
echo

if [[ -z "$1" || "$1" == "-" ]]; then
    INPUT="cat"
    echo "Чтение из stdin (можно запустить: redis-cli MONITOR | $0)"
else
    if [[ ! -f "$1" ]]; then
        echo "ОШИБКА: файл не найден: $1"
        exit 1
    fi
    INPUT="cat \"$1\""
    echo "Обрабатывается файл: $1"
fi

echo "Запущен: $(date '+%Y-%m-%d %H:%M:%S')"
echo

# Потоковая магия: вытаскиваем ключ tax_sent_... и сразу считаем статистику
eval "$INPUT" | \
stdbuf -oL grep -E '"SETEX" "tax_sent_' | \
stdbuf -oL sed -n 's/.*"SETEX" "tax_sent_\([^"]*\)".*/tax_sent_\1/p' | \
sort | \
uniq -c | \
sort -nr | \
awk '
BEGIN {
    total = 0; unique = 0; dups = 0; extra = 0;
}
{
    count = $1;
    $1 = ""; key = substr($0, 2);
    total += count;
    if (count > 1) {
        dups++;
        extra += (count - 1);
        dup_list = dup_list count "\t" key "\n";
    }
    unique++;
}
END {
    if (unique == 0) coeff = "N/A"; else coeff = sprintf("%.5f", total / unique);

    print "\n================================================================================\n";
    print "                АНАЛИЗ ДУБЛЕЙ ОТПРАВОК В ФНС ЗАВЕРШЁН\n";
    print "================================================================================\n";
    printf "Всего операций SETEX tax_sent_*     : %15s\n", total + 0;
    printf "Уникальных чеков                    : %15s\n", unique;
    printf "Чеков, отправленных >1 раза         : %15s\n", dups;
    printf "Лишних отправок в ФНС (дубли)       : %15s\n", extra;
    printf "Коэффициент дублей                  : %15s x\n", coeff;
    print "================================================================================\n";

    if (dups == 0) {
        print "\nДУБЛЕЙ ОТПРАВОК В ФНС НЕТ — БЛОКИРОВКА РАБОТАЕТ ИДЕАЛЬНО!\n";
    } else {
        print "\nОБНАРУЖЕНО " dups " чеков с дублями отправки в ФНС!\n";
        print "ТОП-20 чеков с наибольшим количеством отправок:";
        print "Повторов  Ключ";
        print "--------------------------------------------------------------------------------";
        n = split(dup_list, arr, "\n");
        asort(arr);
        for (i = n; i >= n-19 && i >= 1; i--) {
            if (arr[i] != "") print arr[i];
        }
        print "\nВсе дубли (" dups " шт.) сохранены в fns_duplicates.txt";
        print dup_list > "fns_duplicates.txt";
    }
}
'

echo
echo "Готово: $(date '+%Y-%m-%d %H:%M:%S')"
echo