linux - 从 Apache/Nginx Access.log 检索用户代理

标签 linux bash apache nginx ssh

我有下面的命令,它打印出命中、主机 IP(本地服务器/负载平衡器)和外部 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,如 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"

最佳答案

如果 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 的每一行拆分为字段:$1 表示主机 IP$10 用于外部 IP$9 用于用户代理

关于linux - 从 Apache/Nginx Access.log 检索用户代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56525488/

相关文章:

macos - 本地主机不适用于 Big Sur(Apache 和 Homebrew)

linux - 使用正在运行的 GUI 程序退出 ssh -X session ,但让程序在远程主机上运行

c++ - 为什么我在 Linux 上看不到 SOCK_SEQPACKET 的 MSG_EOR?

java - 具有 Excel 输入和输出的自动化测试用例

linux - 如何在每次迭代中以批处理模式从 Linux Top 获取输出?

linux - 在 bash 中断开与 wifi 网络的连接

java - 如何在 php 中为 windows 创建 localhost 域管理?

c - 替换 XKeycodeToKeysym

linux - 在 Linux 中编译 ODE 代码

linux - 如何将目录添加到 $PATH 但前提是它不存在