我尝试使用 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/'
尽管可能不是最佳的,但它确实有效。