ログファイルに日付別の一意のIPアドレス数を保存する方法は?

ログファイルに日付別の一意のIPアドレス数を保存する方法は?

このコミュニティに初めて入りました。私はbashスクリプトでこれを行います。私の質問は、私が探しているものをほぼまとめています。複数のIPアドレスと他のデータを含むログファイルがあります。各特定の日付の一意のIPアドレスの数を計算して変数に保存したいと思います。 grepとawkを使ってこれを行う方法についてのアイデアはありますか?

日付形式は2020年2月11日です(例)。

ログファイルのサンプルテキスト:

57.34.156.99 - - [11/Feb/2020:04:32:18 +0330]
43.21.223.33 - - [11/Feb/2020:09:13:05 +0330]
87.44.212.82 - - [14/Mar/2020:06:22:01 +0330]
43.21.223.33 - - [11/Feb/2020:11:05:32 +0330]

上記の出力は次のとおりです。

11/Feb/2020:2
14/Mar/2020:1

ご覧のとおり、重複したIPアドレスは一度だけ計算したいと思います。

助けてくれてありがとう。より多くの情報を提供する必要がある場合は、お知らせください。

ベストアンサー1

これは質問のサンプル形式への答えですが、通常、プロセスは他のログ形式と似ています(通常、日付はISO形式で最初のフィールドにあります)。ジョブとフォーマットを分離するには、まずIPと日付のみを確認してください。

> awk '{print substr($4,2,10), $1}' file
11/Feb/202 57.34.156.99
11/Feb/202 43.21.223.33
14/Mar/202 87.44.212.82
11/Feb/202 43.21.223.33

ハッシュが日付と IP で「date-ip」に増加する連想配列を使用できます。実際の結果を計算するために別の配列が使用されます。ここでハッシュは日付にすぎません。

awk '{d = substr($4,2,10)} !seen[d FS $1]++ {cnt[d]++}
    END {for (x in cnt) print x ":" cnt[x]}
    ' file | sort -t ":" -rnk2

出力:

11/Feb/202:2
14/Mar/202:1
  • cnt配列の順序は定義されていないので、ip countを介してEND日付をパイプするのが便利です。sortまたはあなたは使用することができますGNU awk配列ソート機能

  • の変数は暗黙的に定義されておらず、最初は0または空の文字列なので、awk新しい「date-ip」セットに対して!seen[date-ip]++trueになり、その後は変数が増えます。したがって、次にこの「date-ip」に遭遇すると、これは偽になり、それを増やすことはありませんcnt[date]


各行から「date-ip」のみを抽出し、sort同じことを行います。uniq

> awk '{print substr($4,2,10), $1}' file | sort -u | awk '{print $1}' | uniq -c
      2 11/Feb/202
      1 14/Mar/202

ここでは、ソート中に重複項目を削除しsort -uuniq入力は後でソートする必要があるため)、最初のフィールド(日付)のみを保持し、最後にuniq -c各固有日付の数を印刷します。この内容は、慣れていない人が読みやすくなりますawk。プロセスを実証するために、コマンドの各ステップを印刷して進捗状況を確認できます。

おすすめ記事