このコミュニティに初めて入りました。私は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 -u
(uniq
入力は後でソートする必要があるため)、最初のフィールド(日付)のみを保持し、最後にuniq -c
各固有日付の数を印刷します。この内容は、慣れていない人が読みやすくなりますawk
。プロセスを実証するために、コマンドの各ステップを印刷して進捗状況を確認できます。