首页 > 解决方案 > 从 Apache/Nginx Access.log 检索用户代理

问题描述

我有下面的命令,它打印出命中、主机 IP(本地服务器/负载平衡器)和外部 IP(导致命中的那个)我还想在给出的信息旁边打印出用户代理信息。请问如何实现?

cat access.log | sed -e 's/^\([[:digit:]\.]*\).*"\(.*\)"$/\1 \2/' | sort -n | uniq -c | sort -nr | head -20

我得到的是下面...

命中、主机 IP、外部 IP

如果可能的话,我想要什么...

点击、IP(主机示例)、外部 IP(导致点击)、用户代理

10000 192.168.1.1 148.285.xx.xx Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/98 Safari/537.4

下面附上日志的摘录

192.168.xxx.x - - [10/Jun/2019:12:40:15 +0100] "GET /company-publications/152005 HTTP/1.1" 200 55848 "google.com" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6" "xx.xx.xx.xx"

标签: linuxbashapachenginxssh

解决方案


如果 GNU AWK ( gawk) 可用,请尝试以下操作:

awk -v FPAT='(\"[^"]+\")|(\\[[^]]+])|([^ ]+)' '
{ gsub("\"", "", $9); gsub("\"", "", $10); print $1 " " $10 " " $9 }
' access.log | sort -n | uniq -c | sort -nr | head -20
  • 的值FPAT表示 中每个字段的正则表达式access.log。即:“用双引号括起来的字符串”、“用方括号括起来的字符串”或“用空格分隔的字符串”。
  • 然后,您可以将每一行拆分access.log为字段:$1for host IP$10forexternal IP$9for user agent

推荐阅读