我正在编写脚本,我将接收时间和文件夹名称作为输入,我需要找到一个文件(snort.log。*),该文件属于我的用户输入的时间范围(他将看到警报文件中的粗体时间戳,并输入实际的 snort.log.** 文件的时间,该文件包含攻击的详细信息,警报文件仅包含元数据)这里是目录示例
[jump1@widids01 snort-3]# ls -ltr | tail -6 -rwxr-x--- 1 snort snort 301731 2月 2 18:18 snort.log.1517557015 -rwxr-x--- 1 snort snort 5720853 2月5日 21:11 snort.log.1517563475 -rwxr-x--- 1 snort snort 3566073 2月7日 16:00 snort.log.1517832965 -rwxr-x--- 1 snort snort 18999 2月7日 20:46 snort.log.1518003111 -rwxr-x--- 1 snort snort 20705098 2月15日 19:00 snort.log.1518004113 -rw------- 1 snort snort 357271 2月15日 22:22 snort.log.1518688923 -rwxr-x--- 1 snort snort 50782147 2月15日 22:22 警报 [jump1@widids01 snort-3]# tail -3 警报 02/15-18:22:02.204655 [1:2403380:38412] ET CINS 主动威胁情报信誉不佳 IP TCP 组 41 [分类:杂项攻击] [优先级:2] {TCP} 02/15-22:22:03.335107 [1:2403408:38412] ET CINS 主动威胁情报信誉不佳 IP TCP 组 55 [分类:杂项攻击] [优先级:2] {TCP} 02/15-22:22:03.335107 [1:2403408:38412] ET CINS 主动威胁情报信誉不佳 IP TCP 组 55 [分类:杂项攻击] [优先级:2] {TCP}
我在这里遇到的问题snort.log.[epoch]
是[epoch]
文件生成时间,因此如果用户输入
测试用例1:
time:2015-02-15-22:28:02
如何向他提供snort.log.file
攻击数据包含的位置的匹配信息
测试用例2:
time:2015-02-15-18:22:02
如何向他提供snort.log.file
攻击数据包含的位置的匹配信息
我尝试过但find . -newermt "2018-02-15 18:38:00" ! -newermt "2018-02-15 18:39:00"
没有得到正确的输出。
答案1
假设您有这样的输入:
time="time:2015-02-15-18:22:02"
然后,您可以将其转换为 Unix 时间戳(自纪元以来的秒数)并将其保存在变量中timestamp
:
time=$(date -d$(<<<"$time" sed 's/time:\(.*\)-/\1T/') +%s)
我sed
在这里使用去掉前缀time:
并将日期和时间之间的冒号更改为T
(ISO 8601),date
然后用于将时间戳转换为自纪元以来的秒数。
根据此时间戳所代表的内容,您可以使用它find
来输出日志的文件名:
如果文件名已经包含时间戳,则可以
snort.log.$time
直接使用如果是文件的修改时间:
find . -type f -name "*snort.log.*" -newermt @$(($time-1)) ! -newermt @$time
这将找到修改时间在
time
-1 秒到之间的每个日志文件time
。如果您需要查找给定时间戳之后最旧的日志文件,则可以使用
sort
和head
:find . -type f -name "*snort.log.*" -newermt @$(($time-1)) -print0 | sort -z | head -zn1
如果你需要找到日志文件(以任何方式)包含给定的时间戳,使用
grep
:grep -l $time *
如果您有很多长日志文件,可以将其与
find
and/or结合parallel
起来以加快速度,例如:find . -type f -name "*snort.log.*" -newermt @$(($time-1)) -exec grep -l $time {} +