【问题标题】:Retrieving User Agent from Apache/Nginx Access.log从 Apache/Nginx Access.log 检索用户代理
【发布时间】:2019-10-24 19:13:17
【问题描述】:

我有下面的命令,它打印出命中、主机 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"

【问题讨论】:

    标签: linux bash apache nginx ssh


    【解决方案1】:

    如果 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的每一行拆分成字段:$1host IP$10 对应于external IP$9 对应于user agent

    【讨论】:

    • 谢谢你这似乎工作得很好!一个单独的问题...您是否知道我可能如何对作为该awk 命令的补充提供的IP 执行域查找?
    • 很高兴知道它正在工作。至于您的问题,AWK 没有用于域查找的内置命令。您可能需要使用外部命令为nslookup
    • 谢谢 tshiono...所以之后我需要将其作为单独的命令运行?
    • 这可能取决于您希望如何显示最终结果。如果您可以发布几个示例日志行和所需的输出,我可能会对您有所帮助。
    猜你喜欢
    • 2023-03-12
    • 2020-06-20
    • 2019-01-29
    • 2014-03-31
    • 2012-03-22
    • 1970-01-01
    • 2015-03-22
    • 2021-07-06
    • 1970-01-01
    相关资源
    最近更新 更多