使用 shell 脚本解析 vsftpd 日志

使用 shell 脚本解析 vsftpd 日志

我尝试使用 vsftpd 解析此行:

Sun Apr 7 07:23:33 2013 [pid 23590] [cam02430] OK UPLOAD: Client "206.132.183.209", "/20130407/07/20130407_072324D.avi", 496846 bytes, 383.38Kbyte/sec

和:

cut -d" " -f9 | sed 's/\[\(.*\)\]/\1/'

这将成功解析出用户名:cam02430

但现在日期已经改变:

Wed Apr 10 10:37:50 2013 [pid 26137] [cam02299] OK UPLOAD: Client "206.132.183.201", "/20130410/10/20130410_103802D.avi", 496838 bytes, 363.67Kbyte/sec

现在要解析这个我必须使用:

cut -d" " -f8 | sed 's/\[\(.*\)\]/\1/'

有没有更好的方法在一行中解析用户名?我想坚持使用 shell 脚本。

答案1

我的第一反应是隔离用户部分(使用grep -o)。这样做的好处是它有一些(相对)独特的标记 - 括号。

因此,下面的 grep 隔离了带有括号的(两个)字段,然后取出第一个字段(进程 ID),然后从剩余部分(用户字段)中剥离括号

 < vsftp.log grep -o '\[[^]]*\] *\[[^]]*\]' | sed -e 's/\[[^]]*\] *//' -e 's/\[\(.*\)\]/\1/'

如果您可以保证用户名中没有空格,您可以利用这一点并稍微简化一下。找到没有空格的括号字段(pid 字段会有空格),然后进行修剪。

< vsftp.log grep -o '\[[^] ]*\]' | sed -e 's/\[\(.*\)\]/\1/'

尽管可能不是最佳的,但它确实有效。

相关内容