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

Bash 如何解析字符串模式的文本文件并计算唯一条目?,bash,parsing,split,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 我需要计算和总结的是这行的用户。模式总是用户密码失败,这很有帮助,但我无法执行awk-F或其他字符串拆分操作,因为行中有大

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

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
我需要计算和总结的是这行的
用户。模式总是
用户密码失败
,这很有帮助,但我无法执行
awk-F
或其他字符串拆分操作,因为行中有大量其他垃圾


如何计算每个失败登录的次数,并将每个用户的登录次数相加?

下面的
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

使用GNU grep,请尝试以下操作:

grep -Po "Failed password for \K.*?(?= from)" logfile.log | sort | uniq -c
-p
启用perl正则表达式,允许
\K

-o
只打印匹配的部分,而不是包含匹配项的整行。
\K
使grep忘记它之前匹配的部分,这样它就不会出现在输出中。
*?
匹配用户。仅打印此部分。
(?=from)
是确定用户何时结束所需的前瞻

grep
部分为用户的每次失败登录尝试打印用户。现在我们只需要计算每个用户的发生次数。这是通过习惯用法
sort | uniq-c
实现的

最终输出如下所示:

      7 adam
      2 bob
     14 claire

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

以下是一个perl解决方案:

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

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

我相信您有输入错误,您应该在
grep
命令后添加输入文件名。@RavinderSingh13您可以在开头添加它,太:
这太完美了!它工作得很好!我唯一的问题是,如何让它们从最大数到最小数排序?@user3066571很高兴听到这个消息。您可以再次使用
sort-nr
对结果进行排序。请参见编辑后的答案。