我有一个日志文件,有数千次用户登录尝试,我需要找到失败的登录尝试,并列出失败尝试的用户名。
失败的尝试都标有" input_userauth_request"。所以我开始使用:
grep" input_userauth_request" file.txt列出了所有看起来像这样的行:
userauth_request:无效的用户nagios [preauth]
userauth_request:无效的用户学生[preauth]
userauth_request:无效的用户销售[preauth]
现在我需要列出用户名,但我无法弄清楚如何打印这些用户名。所以基本上我需要弄清楚如何打印:
的nagios
学生
销售
任何帮助都将非常感谢!!
答案 0 :(得分:0)
只需通过cut
获取name
字段,grep .
放弃空行,然后转到sort -u
以获得唯一结果:
grep "userauth_request" file.txt | cut -d' ' -f4 | grep . | sort -u
你会得到:
nagios
sales
student
答案 1 :(得分:0)
将此作为测试文件:
$ cat file.txt
userauth_request: invalid user nagios [preauth]
userauth_request: invalid user student [preauth]
userauth_request: invalid user sales [preauth]
这个awk命令检索用户名:
$ awk '/userauth_request/ {print $4}' file.txt
nagios
student
sales
/userauth_request/
这会选择与正则表达式 userauth_request`匹配的行
print $4
对于选定的行,将打印第四个字段。
如果file.txt很大,则可能会有重复的名称。如果要删除重复的名称:
$ awk '/userauth_request/ {print $4}' file.txt | sort -u
nagios
sales
student
如果您希望计算每个学生尝试登录失败的次数:
$ awk '/userauth_request/ {print $4}' file.txt | sort | uniq -c
1 nagios
1 sales
1 student
答案 2 :(得分:0)
如果您的grep具有类似gnu grep 3.1的Perl Regex支持(PCRE),那么您可以执行以下操作:
$ cat file1
userauth_request: invalid user nagios [preauth]
userauth: succesful user george [auth]
userauth_request: invalid user student [preauth]
userauth_request: invalid user sales [preauth]
$ grep -Po 'userauth_request:.*user \K.[^[]*' file1
nagios
student
sales
-P
启用PCRE
-o
仅返回匹配的模式而不是整行(grep default)
\K
意味着忘记到目前为止的一切,并期待着
.[^[]*
表示捕获所有字符,直至首次找到[
(不包括此[
字符)