如何解析字符串模式的文本文件并计算唯一条目?

时间:2018-01-27 19:14:48

标签: bash parsing split

我有一个包含登录数据的日志文件,我需要生成一个报告,汇总所有失败的登录尝试并由用户组织。该文件中的一行如下所示:

Jan 21 19:22:23 localhost sshd[1234]: Failed password for USER from 127.0.0.1 port 12345 ssh2  #IPs and such obscured, obviously

它是我需要计算和总结的USER行。该模式始终为Failed password for USER,因此有帮助,但由于线路上其他垃圾的数量,我无法执行awk -F或其他字符串拆分。

如何计算每个失败的登录信息并按用户计算总数?

3 个答案:

答案 0 :(得分:1)

使用GNU grep,试试这个:

grep -Po "Failed password for \K.*?(?= from)" logfile.log | sort | uniq -c

-P启用perl正则表达式,允许使用\K之类的内容 -o仅打印匹配的部分,而不是包含匹配的整行 \K使grep忘记之前匹配的部分,以便它不会出现在输出中 .*?与USER匹配。只打印此部分 (?= from)是确定USER何时结束所需的先行者。

grep部分为USER的每次失败登录尝试打印USER。现在我们只需要计算每个用户的出现次数。这是通过习语sort | uniq -c完成的。

最终输出如下:

      7 adam
      2 bob
     14 claire

输出按用户名排序。要按失败尝试次数排序,请将| sort -nr附加到命令。

答案 1 :(得分:0)

关注awk可能对您有帮助。

awk '/Failed password for/{gsub(/.*for | from.*/,"");a[$0]++} END{for(i in a){print i,a[i]}}'  Input_file

现在也添加非单线形式的解决方案。

awk '
/Failed password for/{
  gsub(/.*for | from.*/,"");
  a[$0]++
}
END{
  for(i in a){
    print i,a[i]}
}
'   Input_file

答案 2 :(得分:0)

这是一个perl解决方案:

perl -nle '$seen{$1}++ if /Failed password for (\S+) from /; END { print "$_: $seen{$_}" for sort keys %seen }'

这个想法是使用正则表达式从匹配的行中提取用户名,使用它来在哈希中构建直方图(将用户名映射到计数),并在最后打印出来。