Как решить эту задачу, я вытащил свинину, ежедневно обновляющую новые подписи к sid_changes.log
, и вот ключевое слово поиска «Новые правила», я хотел сделать поиск снизу for sid_changes.log
и разделить эту строку после соответствия «Новый Правила »в новый файл, я ознакомился с grep -A ,-B
, но эти флаги ожидают номера строк, и я не могу определить номер строки, поскольку он будет динамическим .... поэтому эти флаги мне не нужны.
Я пробовал до сих пор с командой diff
diff --changed-group-format="%>" --unchanged-group-format="" data1 data2
и есть ли лучшая техника, потому что мне нужно установить задания cron, чтобы сначала скопировать sid_changes.log
, прежде чем он будет обновлен, а затем разнести его с новым sid_changes.log
, так что это выглядит испорченным решением ... Я ожидаю лучшего решения или дизайна для этого.
sid_changes.log -=Begin Changes Logged for Wed Jan 2 19:05:09 2018 GMT=- New Rules Reported CnC Server Port 40669 Group 1 (1:2405179) Server Port 45351 Group 1 (1:2405180) -=Begin Changes Logged for Wed Jan 3 19:05:09 2018 GMT=- New Rules ET CNC Shadowserver Reported CnC Server Port 40669 Group 1 (1:2405179) ET CNC Shadowserver Reported CnC Server Port 45351 Group 1 (1:2405180) ET CNC Shadowserver Reported CnC Server Port 47221 Group 1 (1:2405181) -=Begin Changes Logged for Thu Jan 4 19:05:01 2018 GMT=- New Rules BROWSER-OTHER Apple Safari javascript mutlibyte character escaping denial of service attempt (1:45354) BROWSER-OTHER Apple Safari javascript mutlibyte character escaping denial of service attempt (1:45355) BROWSER-OTHER Multiple browser long unicode string denial of service attempt (1:45302) BROWSER-OTHER Multiple browser long unicode string denial of service attempt (1:45303) BROWSER-PLUGINS UCanCode ActiveX clsid access attempt (1:45270) ouputfile.log -=Begin Changes Logged for Thu Jan 4 19:05:01 2018 GMT=- New Rules BROWSER-OTHER Apple Safari javascript mutlibyte character escaping denial of service attempt (1:45354) BROWSER-OTHER Apple Safari javascript mutlibyte character escaping denial of service attempt (1:45355) BROWSER-OTHER Multiple browser long unicode string denial of service attempt (1:45302) BROWSER-OTHER Multiple browser long unicode string denial of service attempt (1:45303) BROWSER-PLUGINS UCanCode ActiveX clsid access attempt (1:45270)
Я использовал бы a perl
управляйте как это:
perl -ne 'if($_=~/^-=Begin/){@last=@block; @block=(); push(@block,$_);}else{push(@block,$_)}; END{@last=@block; print @last}'
Объяснение:
perl -ne '
-> чтение ввело мудрую строкуif($_=~/^-=Begin/){@last=@block; @block=();push(@block,$_);}
-> сбрасывают последний блок, чтобы выстроить в последний раз и запустить новый блок, если строка начинается - =Beginelse{push(@block,$_)};
-> добавляют текущую строку для блокированияEND{@last=@block; print @last}'
-> сбрасывают последний блок и печать это
Читать из sid_changes.log
и запишите в outfile.log
, можно выполнить его как это:
perl -ne '...' < sid_changes.log > outfile.log
Вы можете использовать grep
, чтобы найти номер строки разделителя записей журнала последних событий, а затем использовать tail
, чтобы печатать только строки из них:
lineno="$(grep -ne '^-=' sid_changes.log | tail -n 1 | cut -d ':' -f 1)"
tail -n "+$lineno" sid_changes.log > outfile.log
или как однострочник
tail -n "+$(grep -ne '^-=' sid_changes.log | tail -n 1 | cut -d ':' -f 1)" sid_changes.log > outfile.log
Если вход является не файлом, а каналом / FIFO, и вы можете проходить по нему только тогда, когда можете использовать небольшую программу, которая отслеживает записи журнала, но возвращает только последнюю:
#!/usr/bin/env python3
import sys
separator_prefix = '-='
last_entry = []
for line in sys.stdin:
if line.startswith(separator_prefix):
last_entry.clear()
last_entry.append(line)
print(*last_entry, sep='', end='')
Использование:
python3 last-chang-entry.py < sid_changes.log > outfile.log