grep form bottom 并显示匹配后的行

grep form bottom 并显示匹配后的行

如何完成这个任务,我已经把每天的新签名更新到最新的版本,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

相关内容