標準のコマンドラインツールを使用して、コマンド出力のすべてのIPアドレスを解析します。

標準のコマンドラインツールを使用して、コマンド出力のすべてのIPアドレスを解析します。

多数のIPアドレスを含む複数のログファイルがあります。 IPアドレスを一致させて確認できるプログラムを介してデータを転送できるようにしたいです。

IE猫/var/log/somelogfile |

これはラインになります

10:45に10.13.13.10にアクセス

入力する

10:45 myhostname.intranet経由でアクセス

私の考えでは、sedとホストの組み合わせを使用してこれを行う方法があるかもしれませんが、方法はわかりません。これを行うために簡単なスクリプトを書くことができることを知っていますが、可能であれば組み込みツールを使用したいと思います。どんな提案がありますか?

ベストアンサー1

Pythonの迅速で汚い解決策は次のとおりです。キャッシング(ネガティブキャッシングを含む)を実行しますが、スレッドはなく、これまで見たものの中で最も速いものではありません。同じ名前で保存すると、rdns次のように呼び出すことができます。

zcat /var/log/some-file.gz | rdns
# ... or ...
rdns /var/log/some-file /var/log/some-other-file # ...

これを実行すると、PTRレコードとしてIPアドレスにコメントが追加されます。

$ echo "74.125.132.147, 64.34.119.12." | rdns
74.125.132.147 (rdns: wb-in-f147.1e100.net), 64.34.119.12 (rdns: stackoverflow.com).

ソースは次のとおりです。

#!/usr/bin/env python

import sys, re, socket

cache = dict()

def resolve(x):
    key = x.group(0)
    try:
        return "%s (rdns: %s)" % (key, cache[key])
    except KeyError:
        try:
            cache[key] = socket.gethostbyaddr(key)[0]
        except socket.herror:
            cache[key] = '?'
        return "%s (rdns: %s)" % (key, cache[key])

for f in [open(x) for x in sys.argv[1:]] or [sys.stdin]:
    for line in f:
        sys.stdout.write(re.sub("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", resolve, line))

# End of file.

注:これはまさにあなたが求めるものではありません(「標準ツール」を使用)。ただし、IPアドレスに会うたびにそれを解析するよりも多くの助けになる可能性があります。さらに数行を追加すると、結果を継続的にキャッシュすることができ、繰り返し呼び出しに役立ちます。

おすすめ記事