web-dev-qa-db-ja.com

各IPアドレスがログファイルに表示される回数のカウント

次のような形式のファイルがあります。

$ cat file.txt

27.33.65.2
27.33.65.2
58.161.137.7
121.50.198.5
184.173.187.1
184.173.187.1
184.173.187.1

ファイルを解析する最良の方法は何ですかfile.txtを次のような形式に変更します。

27.33.65.2: 2
58.161.137.7: 1
121.50.198.5: 1
184.173.187.1: 3

つまり、ファイルをループして、各IPアドレスが出現する回数を数えたいのです。私はすでにsortを介して実行しているため、すべてのIPアドレスは順番に並べられ、順番に並んでいます。

9
James Spittal

あなたが探しています - uniq -c

その出力が好みに合わない場合は、簡単に解析および再フォーマットできます。

例えば:

$ uniq -c logfile.txt | awk '{print $2": "$1}'
27.33.65.2: 2
58.161.137.7: 1
121.50.198.5: 1
184.173.187.1: 3
23
glenn jackman

uniqは確かに賢い解決策のようです。 awkの方法:

awk '{ip_count[$0]++}; '\
'END {for (ip in ip_count) printf "%15s: %d\n",ip,ip_count[ip];}' file
6
Hauke Laging

私はpythonを使用します。最近のすべてのLinuxシステムにはpython2がインストールされています。

各IPアドレスをキー=値のペアとしてdict(連想配列)に追加します(例:{"12.34.56.78":1、 "87.76.43.21":3})。

IPアドレスをキーとして「確認」し、値を1だけ増やします。defaultdict( "ip")を使用すると、キーが存在しない場合、デフォルト値0で作成されます。キーが存在する場合すでにdefaultdictは何もしません。値は次の行で増分されます。

#!/usr/bin/python2

infile = open("file.txt","r")
iplist = {}  # create an empty dict

for line in infile:
    line = line.strip()   # remove newline.
    if line: # if not a blank line.
        iplist.setdefault(line, 0) # check for ip and add with default value of 0
        iplist[line] += 1 # increment

outfile = open("out.txt","w") #open output file

for key in iplist.keys():
    line = "%-15s = %s" % (key, iplist[key])
    print line   # print uf desired.
    outfile.write(line + "\n")

outoutファイル:

cat out.txt                                                          
27.33.65.2      = 2
58.161.137.7    = 1
121.50.198.5    = 1
184.173.187.1   = 3

コマンドラインソリューションを探していたのは承知していますが、ご覧のとおり、エレガントな形式のディスプレイで数十行しかかかりませんでした。 Pythonは、管理のための優れたツールです。

0
Mike Childers