如何完成这个任务,我已经把每天的新签名更新到最新的版本,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 -=开始记录 2018 年 1 月 2 日星期三 19:05:09 GMT 的变更=- 新规则 报告的 CnC 服务器端口 40669 组 1 (1:2405179) 服务器端口 45351 组 1 (1:2405180) -=开始记录 2018 年 1 月 3 日星期三 19:05:09 GMT 的变更=- 新规则 ET CNC Shadowserver 报告 CnC 服务器端口 40669 组 1 (1:2405179) ET CNC Shadowserver 报告 CnC 服务器端口 45351 组 1 (1:2405180) ET CNC Shadowserver 报告 CnC 服务器端口 47221 组 1 (1:2405181) -=开始记录 2018 年 1 月 4 日星期四 19:05:01 GMT 的变更=- 新规则 浏览器 - 其他 Apple Safari javascript 多字节字符转义拒绝服务尝试 (1:45354) 浏览器 - 其他 Apple Safari javascript 多字节字符转义拒绝服务尝试 (1:45355) BROWSER-OTHER 多浏览器长 Unicode 字符串拒绝服务尝试(1:45302) BROWSER-OTHER 多浏览器长 Unicode 字符串拒绝服务尝试(1:45303) 浏览器插件 UCanCode ActiveX clsid 访问尝试 (1:45270) 输出文件.log -=开始记录 2018 年 1 月 4 日星期四 19:05:01 GMT 的变更=- 新规则 浏览器 - 其他 Apple Safari javascript 多字节字符转义拒绝服务尝试 (1:45354) 浏览器 - 其他 Apple Safari javascript 多字节字符转义拒绝服务尝试 (1:45355) BROWSER-OTHER 多浏览器长 Unicode 字符串拒绝服务尝试(1:45302) BROWSER-OTHER 多浏览器长 Unicode 字符串拒绝服务尝试(1:45303) 浏览器插件 UCanCode ActiveX clsid 访问尝试 (1:45270)
答案1
我会使用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,$_);}
-> 如果行以 -=Begin 开头,则将最后一个块刷新到数组最后并开始新的块else{push(@block,$_)};
-> 将当前行添加到块中END{@last=@block; print @last}'
-> 刷新最后一个块并打印它
要读取sid_changes.log
和写入outfile.log
,您可以像这样运行它:
perl -ne '...' < sid_changes.log > outfile.log
答案2
您可以使用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