我正在寻找一些帮助来尝试优化兄弟网络日志解析脚本,这是背景:
我有大量的兄弟日志,但我只对查询我范围内的 IP(多个可变长度子网)感兴趣。
所以我有一个带有正则表达式模式的文本文件来匹配我正在寻找的 IP 范围:scope.txt:
/^10\.0\.0\.([8-9]|[1-3][0-9]|4[0-5])$/
Run Code Online (Sandbox Code Playgroud)
(scope.txt 在正则表达式模式中包含最多 20 行其他 IP 范围)findInScope.sh:
#!bin/sh
for file in /data/bro_logs/2016-11-26/conn.*.log.gz
do
echo "$file"
touch /tmp/$file
for nets in $(cat scope.txt)
do
echo "$nets"
zcat $file | bro-cut -d | awk '$3 ~ '$nets' || $5 ~ '$nets'' >> /tmp/$file
done
sort /tmp/$file | uniq > ~/$file
rm /tmp/$file
done
Run Code Online (Sandbox Code Playgroud)
作为更多背景,原始bro conn日志每小时大约100MB,因此我当前的脚本大约需要10-20分钟来解析一小时的日志数据。一天的日志最多可能需要 3 小时。
我想过一个带有 40 个 or 的 awk 语句,但决定我不想这样做,因为我想要一个单独的 scope.txt 文件,以便对不同范围的 IP 范围使用相同的脚本。
我还在多个 conn.log 文件(即 zcat conn.*.log.gz)上尝试了 zcat,但输出文件最终超过 1GB,我想保持每小时日志完整。
通过 awk 只传递一次日志文件,您应该会收获很多。这意味着将所有正则表达式合并为一个。如果您不想在scope.txt
文件中执行此操作,请在调用 awk 之前执行此操作。例如,
sed <scope.txt 's|^/\^|(|; s|\$/$|)|; $!s/$/|/' | tr -d '\n' >pattern
zcat $file | bro-cut -d |
awk '
BEGIN{ getline pat <"pattern"; pat = "^(" pat ")$" }
$3 ~ pat || $5 ~ pat
' >~/$file
Run Code Online (Sandbox Code Playgroud)
sed用一个封闭的对替换每个正则表达式行周围的/^
和,在行尾添加一个,并将结果全部放在一行中到 file 。因此,该文件是所有模式的或-ed 在一起。缺少的部分添加在 awk 脚本语句中,该语句将模式文件读入变量.$
()
|
pattern
^(...)$
BEGIN
pat
以上替换了您的内部for
循环,而sort|uniq
.