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


9

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

$ 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アドレスは順番に並べられており、互いに直接続いています。


私は個人的に、この種類のファイルを近くの便利なDBにインポートし(私が手にしたpostgresインスタンスに一時テーブルを作成することにより)、続いて簡単なSQLアクションを実行してテキストファイルにエクスポートします。
oakad 2014年

回答:


23

あなたが探しています 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

組み合わせるuniqawk...私には偉大なアプローチではないようです
Hauke Laging

3
uniqソートされた入力でのみ機能するため(隣接する一致する行に一致し、ファイルの行には一致しません)。
oakad

1
結果をuniqにパイプする前にソートする必要があります。オリジナルのQを読むと、OPはsort
slm

2
@HaukeLaging-私はあなたが言っていることに感謝しますが、コンピュータのほとんどのユーザーがOSXとWindowsを超えて冒険することはないのと同じように、さらにUnixのほとんどのユーザーは特定のタスクに指定されたツールを使用することを超えないでしょう。AWKの使用は、気弱な人には向いていません。AWKを使用してこの基本的なタスクを実行するために何をしなければならなかったかと、Glennのソリューションに必要なものとを比較してください。私は彼が精神的に把握するためのより簡単な解決策であると言っているのは公平だと思いますが、あなたの方がより効率的です。ところで、両方とも正しいので、私は両方のUVを行いました!
slm

1
@HaukeLaging-はい、まさに。サイトをぶらつくと、IMOの責任が少し変わります。私たちは、包括的なA'erを作成し、OPとそれを通過するすべての将来のビジター(IMO)に教える瞬間として提供するA'erを確認する責任があります。ただし、これは個人的な選択であるため、数分余裕がある場合は、任意の形式でAを提供することを常にお勧めします。
slm

6

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

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

+1。出力の順序がOPにとって重要である場合、この答えは保証をしません。連想配列のキーを反復することは固有の順序を持​​ちません。
グレン・ジャックマン、2014年

@glennjackmanしかし、sortソートする必要のあるアイテムが少ないため、私の答えに追加する方がより高速です。;-)
Hauke Laging 2014年

そうそう?そうそう?!?;)入力はすでにソートされています。このawkの回答はそれらをシャッフルするので、さらに多くの作業が必要です。ニャ!;)
グレン・ジャックマン、2014年

0

ファイアソートファイルは、unic -cによってカウントを取得します

sort filename | uniq -c


1
ファイルは既に(質問のユーザーによると)ソートされており、機能しuniq -cますが、誤った形式で出力を提供します。これが、受け入れられた回答が使用せずsort、代わりにの出力を再フォーマットする理由ですuniq -c
Kusalananda

@Aeydに感謝します。このコマンドを探していました。役立ちます
user11392987

0

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

各IPアドレスをdict(連想配列)にkey = valueのペア、つまり{"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は管理のための優れたツールです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.