Bash

從 nginx 訪問日誌文件中查找訪問 /page1 而不是 /page2 的 IP 地址

  • November 17, 2018

我需要從日誌文件中選擇特定數據。我需要兩個腳本:

  1. 我需要選擇所有隻訪問過的 IP 地址/page1
  2. 我需要選擇所有訪問過/page1但從未訪問過的 IP 地址/page2

.tar我在一個文件中有我想要的日誌。我希望將它們提取到一個文件夾中,然後我將使用腳本來解析它們並刪除它們。所有重複的 IP 地址。

這是我到目前為止所擁有的:

# filter /page1 visitors
cat access.log | grep "/page1" > /tmp/res.txt
# take the IP portion of record
cat res.txt | grep '^[[:alnum:]]*\.[[:alnum:]]*\.[[:alnum:]]*\.[[:alnum:]]*' -o > result.txt

典型的訪問日誌看起來像

162.158.86.83 - - [22/May/2016:06:31:18 -0400] "GET /page1?vtid=nb3 HTTP/1.1" 301 128 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0"
awk '/^\/page1?/ {print $1}' /path/to/access.log | sort -u > result.txt

如果要計算每個唯一 IP,請更改sort -usort | uniq -c

如果您只想匹配日誌的請求路徑欄位(而不是整行)/page1

awk '$7 ~ /^\/page1?/ {print $1}' /path/to/access.log | sort -u > result.txt

注意:我認為 nginx 訪問日誌和 apache 訪問日誌是一樣的。如果不是,則計算 nginx 日誌中的欄位(計算每個空格,包括 Date:Time 和 TimeZone 之間的那個),並使用正確的欄位編號而不是$7

最後,如果您想同時列印 IP 地址(或主機名,如果它們已經被解析)和請求路徑:

awk -v OFS='\t' '$7 ~ /^\/page1?/ {print $1, $7}' /path/to/access.log |
   sort -u > result.txt

要查看訪問過/page1但從未訪問過的IP 地址/page2

awk '$7 ~ /^\/page1?/ {print $1}' /path/to/access.log | sort -u > result1.txt
awk '$7 ~ /^\/page2?/ {print $1}' /path/to/access.log | sort -u > result2.txt
comm -2 -3 result1.txt result2.txt

comm-2選項抑制僅出現在 中的行result2.txt,並-3抑制出現在兩個文件中的行。因此,輸出是僅出現在results1.txt.

更多詳細資訊,請參閱man comm

引用自:https://unix.stackexchange.com/questions/285675