一尘不染

在每行匹配后使用grep获取下一个WORD

linux

我想从服务器日志中获取“ GET ”查询。

例如,这是服务器日志

1.0.0.127.in-addr.arpa - - [10/Jun/2012 15:32:27] code 404, message File not fo$
1.0.0.127.in-addr.arpa - - [10/Jun/2012 15:32:27] "GET /hello HTTP/1.1" 404 -   
1.0.0.127.in-addr.arpa - - [10/Jun/2012 15:41:57] code 404, message File not fo$
1.0.0.127.in-addr.arpa - - [10/Jun/2012 15:41:57] "GET /ss HTTP/1.1" 404 -

当我尝试使用简单的grep或awk时,

Adi:~ adi$ awk '/GET/, /HTTP/' serverlogs.txt

它发出

1.0.0.127.in-addr.arpa - - [10/Jun/2012 15:32:27] "GET /hello HTTP/1.1" 404 -
1.0.0.127.in-addr.arpa - - [10/Jun/2012 15:41:57] "GET /ss HTTP/1.1" 404 -

我只想显示: helloss

有什么办法可以做到吗?


阅读 259

收藏
2020-06-03

共1个答案

一尘不染

假设您有gnu grep,则可以使用perl样式的regex进行正向查找:

grep -oP '(?<=GET\s/)\w+' file

如果您没有gnu grep,那么我建议您只使用sed:

sed -n '/^.*GET[[:space:]]\{1,\}\/\([-_[:alnum:]]\{1,\}\).*$/s//\1/p' file

如果您碰巧使用过gnu sed,可以将其大大简化:

sed -n '/^.*GET\s\+\/\(\w\+\).*$/s//\1/p' file

最重要的是,您当然不需要管道即可完成此操作。 grepsed一个就足够了。

2020-06-03