perl -alMFatal=open -pe '
BEGIN{ unlink, open *{+uc}, ">>$_" for qw/file1.log file2.log/; }
select $F[0] =~ s/^\D*//r eq $F[2] =~ s/^\D*//r ? *{"FILE1.LOG"} : *{"FILE2.LOG"};
' sample.txt
Perl
опции :-a
разделит строку на поля на основе пробелов, и эти поля доступны через$F[0] $F[1]...
-l
установит RS
на новую строку и ORS
на новую строку. -M
загрузит модуль Fatal.pm
и включит функцию open
из своего пространства имен. Это означает, что любые ошибки при открытии файла в основном коде должны умереть. -p
будет читать строку файла sample.txt -за строкой -, а автоматическая -печать строк будет включена после применения к ней всех преобразований. BEGIN
должен удалить все существующие файлы file1.log и file2.log и открыть дескрипторы файлов в режиме append
для файлов. select
выбирает дескриптор файла для печати текущей строки. $F[0] =~ s/^\D*//r
удалит все начальные нецифры в первом поле (это предполагает, что все цифры помещены в конец поля ). -p
. OTW, дескриптор файла *FILE2.LOG делается дескриптором по умолчанию, а опция -p
заставляет Perl
печатать здесь текущую строку. Мы можем сделать то же самое, используя sed
инструмент, как показано:(Предполагая, что GNU sed)
sed -Ee '
h;s/\S+/\n&\n/3
/^[^0-9[:blank:]]*([0-9]+).*\n(.*[^0-9])?\1\n/{
g
s/^//w file1.log
d
}
g
' < sample.txt > file2.log
Я только что обнаружил эту проблему на своих серверах. Мой dbpurgeage
также настроен на 24 часа по умолчанию, но мой fail2ban.sqlite3
вырос до 400 МБ и имеет 800 000 банов за последние 2 года.
Оказывается, у fail2ban не было кода для очистки БД до версии 0.11 . Он был добавлен в этот коммит . dbpurgeage до этого ничего не делает.
Посмотреть сколько банов в БД:
sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "select count(*) from bans"
Чтобы узнать, сколько лет вашей самой старой записи в БД:
sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "select datetime(min(timeofban), 'unixepoch') from bans"
Чтобы очистить БД, например, сохранить данные только за последнюю неделю:
sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "delete from bans where timeofban < strftime('%s', 'now', '-7 days')"
sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "vacuum"
Удаление может занять несколько минут, в течение которых fail2ban будет заблокирован при попытке доступа к базе данных. Возможно, вы захотите удалить небольшими партиями (сначала все, что старше 2 лет, затем 1 год и т. д. ), чтобы дать fail2ban возможность работать в промежутках между ними, а в конце выполнить очистку.