次のような形式のファイルがあります。
$ 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アドレスは順番に並べられ、順番に並んでいます。
あなたが探しています - 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
uniq
は確かに賢い解決策のようです。 awkの方法:
awk '{ip_count[$0]++}; '\
'END {for (ip in ip_count) printf "%15s: %d\n",ip,ip_count[ip];}' file
私は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は、管理のための優れたツールです。