ログファイルからテキストパターンを検索する

ログファイルからテキストパターンを検索する

同様の形式のすべての行を含む大きなログファイルがあります。若干異なる場合がありますが、最初の括弧の前の形式は常にまったく同じです。

31.7.112.60 - - [26/Jan/2019:19:32:08 +0330] "GET /product/31284/%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D9%84%D8%A8%D8%A7%D8%B3%D8%B4%D9%88%DB%8C%DB%8C-%D8%AF%D8%B1%D8%A8-%D8%A7%D8%B2-%D8%AC%D9%84%D9%88-%D8%A8%D9%88%D8%B4-%D9%85%D8%AF%D9%84-BOSCH-WAW28760IR-9Kg HTTP/1.1" 200 41935 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" "-"

2つのことを行う必要があります。

A)GET /product/XXXXX/ すべての行(一部の行にはない可能性があります)からこのパターンを検索します。ここで、XXXXXは可変桁数(34213、1242、1423124など)にすることができます。次に、最初の20製品を順番に印刷します。これは次の形式でなければなりません。

34286,25
33954,18
33952,17
33956,16
33953,16

B)IPアドレスを使用して1日のネットユーザー数を見つけて出力します。これは次の形式でなければなりません。

22/Jan/2019,3987
26/Jan/2019,5567 

ベストアンサー1

これは単純なWebサーバーログのように見えます。答えはgrep次のように簡単ですawk

ログファイルの名前をで指定しますhttpd.log。次の複合コマンドを試すことができます。

grep -o 'GET \/product\/[^/]*\/' httpd.log |awk 'BEGIN{FS="\/"}{AA[$3]++}END{for(i in AA){print AA[i]" "i}}'|sort -n -r|awk '{print $2","$1}' |head -n20

最初の部分は重要なテキストがある場合はそれを分離し、2番目の部分は製品番号の各項目を計算して結果を印刷し、3番目の部分はリストをソートし、最後の2つの部分はユーザーが指定した形式で印刷します。

各日付を区切るには、このコマンドの前に別のコマンドを追加してgrep日付を指定できます。

IP クライアントをフィルタリングするには、上記の例に従って直接試してください。

おすすめ記事