#!/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