以下代码可以正常工作,但是花费的时间太长,并且我尝试减少它的原因是由于空格,access.log语法不一致或其他原因而导致的。
与这样的多个发现相比,任何将发现减少到一个*.py
一次的建议都将受到赞赏:
find $LOGS -mtime -30 -type f - print0 and grep/sed/awk/sort
我已经尝试过:find $LOGS -mtime -30 -type f -print0 | xargs -0 grep -B 2 -w "RESULT err=0 tag=97" | grep -w "BIND" | sed '/uid=/!d;s//&\n/;s/.*\n//;:a;/,/bb;$!{n;ba};:b;s//\n&/;P;D' | sed 's/ //g' | sed s/$/,/g |awk '{a[$1]++}END{for(i in a)print i a[i]}' |sort -t , -k 2 -g > $OUTPUT1;
find $LOGS -mtime -30 -type f -print0 | xargs -0 grep -B 2 -w "RESULT err=0 tag=97" | grep -E 'BIND|LDAP connection from*' | sed '/from /!d;s//&\n/;s/.*\n//;:a;/:/bb;$!{n;ba};:b;s//\n&/;P;D' | sed 's/ //g' | sed s/$/,/g |awk '{a[$1]++}END{for(i in a)print i a[i]}' |sort -t , -k 2 -g > $IPAUTH0;
find $LOGS -mtime -30 -type f -print0 | xargs -0 grep -B 2 -w "RESULT err=49 tag=97" | grep -w "BIND" | sed '/uid=/!d;s//&\n/;s/.*\n//;:a;/,/bb;$!{n;ba};:b;s//\n&/;P;D' | sed 's/ //g' | sed s/$/,/g |awk '{a[$1]++}END{for(i in a)print i a[i]}' |sort -t , -k 2 -g > $OUTPUT2;
和其他一些方法,但是似乎语法不正确,希望在这里减少重复次数。
完整的脚本(带一些内容)可以在here中找到,并且可以针对我为电子邮件报告编写的Java程序运行。注意:这会针对约60GB的组合文本的访问日志运行。
答案 0 :(得分:0)
我还没有仔细研究sed
/ awk
/ etc部分(如果没有一些示例数据,它们将很难工作),但是您应该可以共享初始的通过grep
查找与模式的 any 匹配的行,将其存储在临时文件中,然后仅搜索各个模式。我也将使用find ... -exec
而不是find ... | xargs
:
tempfile=$(mktemp "${TMPDIR:-/tmp}/logextract.XXXXXX") || {
echo "Error creating temp file" >&2
exit 1
}
find $LOGS -mtime -30 -type f -exec grep -B 2 -Ew "RESULT err=(0|49) tag=97" {} + >"$tempfile"
grep -B 2 -w "RESULT err=0 tag=97" "$tempfile" | grep -w "BIND" | ...
grep -B 2 -w "RESULT err=0 tag=97" "$tempfile" | grep -E 'BIND|LDAP connection from*' | ...
grep -B 2 -w "RESULT err=49 tag=97" "$tempfile" | grep -w "BIND" | ...
rm "$tempfile"
顺便说一句,您可能不是要搜索LDAP connection from*
-最后的from*
表示“来回”,后跟0个或更多“ m”个字符。
一些通用的脚本建议:使用小写或大小写混合的变量,以避免与各种具有特殊含义的全大写字母名称发生意外冲突。 (除非您想要具有特殊含义,例如设置PATH
。)
此外,在变量引用周围使用双引号通常是一个很好的主意,以防止意外的单词拆分和通配符扩展……除了在某些情况下,脚本依赖于此,例如设置LOGS="/log_dump/ldap/c*"
,然后进行计数使用该变量时发生通配符扩展。在这种情况下,通常最好使用bash数组将每个项目(例如文件名)存储为单独的元素:
logs=(/log_dump/ldap/c*) # Wildcard gets expanded when it's defined
...
find "${logs[@]}" -mtime ... # All that syntax gets all array elements in unmangled form
请注意,在像这样的情况下,实际上并不需要这样做,因为您知道在变量中不会有任何意外的通配符或空格,但是当您处理不受约束的数据时,此方法更安全。 (我主要在macOS上工作,其中文件名中的空格只是生活中的事实,而且我已经学会了使用不受它们混淆的脚本惯用法的艰难方法。)