【问题标题】:Easy way to extract IP and referer from nginx log file从 nginx 日志文件中提取 IP 和引用的简单方法
【发布时间】:2021-10-02 15:10:06
【问题描述】:

如何使用 awk 或其他可能的命令查找包含 facebook/instagram/twitter/etc 的 ip 和 referer,以获取此信息:

1.2.3.4 https://l.instagram.com/
4.3.2.1 https://facebook.com/

Nginx 日志文件具有标准格式:

1.2.3.4 - - [02/Oct/2021:06:07:08 +0300 - -] 200 "GET /index.php HTTP/2.0" 6620 "https://l.instagram.com/" "Mozilla/5.0 (Linux; Android 9; SM-N950F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Mobile Safari/537.36" "-"

我正在使用

awk '{print $1}' access.log

awk -F\" '{print $2}' access.log

但我不知道如何将ip和referer放在一起。

【问题讨论】:

  • 请在您的问题中添加示例输入(无描述、无图像、无链接)以及该示例输入所需的输出(无评论)。

标签: linux awk sed grep


【解决方案1】:
$ awk -F'[ "]' '{print $1, $16}' file
1.2.3.4 https://l.instagram.com/

【讨论】:

  • 为了严格遵守我添加了($16 ~ /instagram\.|facebook\./)。效果很好。
【解决方案2】:

使用 gnu-awk,您可以使用 FPAT 指定字段并使用模式。

示例中的字段来自 [...]"..." 或 1 个或多个非空白字符。

为此,您可以编写一个带有替换 | 的模式来匹配这 3 个变体中的任何一个。

\\[[^][]*]|"([^"]*)"|\\S+

Regex demo

如果 url 应该匹配 instagram 或 facebook,您可以使用其他模式并从匹配项中删除双引号。列值现在是 1 和 8。

awk -v FPAT='\\[[^][]*]|"([^"]*)"|\\S+' '{
  if ($8 ~ /(instagram|facebook)\./) {
    gsub(/"/, "", $8)
    print $1, $8
  }
}' access.log

输出

1.2.3.4 https://l.instagram.com/

【讨论】:

    【解决方案3】:

    awk

    $ awk '{gsub(/,/,"");print $1, $13}' input_file
    

    sed

    $ sed -E 's/^(.[^ ]*).*"(https.[^"]*).*/\1 \2/' input_file
    

    输出

    1.2.3.4 https://l.instagram.com/
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 2019-10-04
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      相关资源
      最近更新 更多