如何从Shell日志文件中提取用户列表?

时间:2020-08-07 19:48:37

标签: linux sh

我得到的日志文件中的条目如下所示。

174.71.76.52 - - [01/Dec/2016:17:22:34 -0600] "GET /~csymons/project/css/normalize.css HTTP/1.1" 304 -

我的问题是从文件中提取一个唯一的用户列表(在本例中为〜csymons)。

我一直在使用此命令来获取用户列表,其中的用户列表位于“ GET”之后。但是,如果请求返回后只是一个“ /”,则不会以用户身份记录。

到目前为止,我一直在使用此命令,但在将其模制为符合标准时遇到困难。

 cat logfile | awk '{print $6,$7}' | uniq | sort  

输出块应该是

"GET /~ejoyce/a3/images/123.jpg
"GET /
"GET /1300-1-xhtml/610.html
"GET /1300-1-xhtml/608.html
"GET /1300-4-cgi/10-3.cgi
"GET /1300-1-xhtml/606.html
"GET /1300-4-cgi/09-3.cgi
"GET /
"GET /1300-1-xhtml/612.html
"GET /2850-1-vanilla/08b.cgi
"GET /2850-1-vanilla/11b.cgi
"GET /2850-1-vanilla/12b.cgi
"GET /robots.txt
"GET /
"GET /robots.txt
"GET /1300-2-css/219.html
"GET /
"GET /robots.txt
"GET /
"GET /robots.txt
"GET /1300-2-css/213.html
"GET /
"GET /robots.txt
"GET /
"GET /robots.txt
"GET /
"GET /robots.txt
"GET /
"GET /robots.txt
"GET /
"GET /robots.txt
"GET /
"GET /robots.txt
"GET /
"GET /1300-3-forms/
"GET /
"GET /robots.txt
"GET /
"GET /robots.txt
"GET /
"GET /2850-3-templates/
"GET /
"GET /robots.txt
"GET /
"GET /1300-1-xhtml/415.html
"GET /
"GET /~ejoyce/a3/images/123.jpg
"GET /
"GET /robots.txt
"GET /
"GET /~ejoyce/a3/images/123.jpg
"GET /
"GET /robots.txt
"GET /
"GET /2850-3-templates/
"GET /

我专门在寻找用户。例如GET /~ejoyce/a3/images/123.jpg-> ejoyce

使用cat日志文件时| awk'{print $ 7}'| sed's#^ [^〜] /([[^ /] [^ /] )/.*$# \ 1#'| uniq -d |排序

images
images
images
images
~jpcollins
~jpcollins
~jpcollins
~lkcantu
~lkcantu
~robert
~robert
~robert
~robert
~robert
~robert
~robert
~robert
~robert
~robert
~robert
~robert
~robert
~robert
~robert
~robert
~robert
/robots.txt
/robots.txt
/robots.txt
/robots.txt
/robots.txt

更多,日志文件有900多个条目

感谢所有提示以帮助解决此问题!

2 个答案:

答案 0 :(得分:0)

如果您的所有用户名均使用小写字母,则应该可以: sed -n 's/.*GET\s\/~\?\([a-z]\+\).*/\1/p' logfile
如果用户名确实包含大写字母,请另外将[a-z]换成[a-zA-Z]
同样,如果~在所有用户中都是持久的,则可以随时删除其后的\?

答案 1 :(得分:0)

在您输入其他信息并说明您想要~ejoyce还是ejoyce之后,您可以使用:

sed -n -E 's#^[^~]+~([^/]+)/.*$#\1#p' logfile | sort -u

在上面的文件中,这将导致单个输出

ejoyce
相关问题