多数の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アドレスに会うたびにそれを解析するよりも多くの助けになる可能性があります。さらに数行を追加すると、結果を継続的にキャッシュすることができ、繰り返し呼び出しに役立ちます。
答え2
私は使用しますjdresolve -n -a
Debian などのパッケージも以下から入手できます。
https://github.com/jdrowell/jdresolve
jdresolve は IP アドレスをホスト名で解決します。すべてのファイル形式は 回線がIPで始まらない場合も含めてサポート 住所
私はApacheログ、イカログ、および多数のIPアドレスを持つ解析を必要とするすべてのエントリを解析するために10年以上使用してきました。うまく動作し、信頼性が高く、高速で、以前に実行されたクエリをキャッシュできます。
答え3
ログファイルとパイプ入力をキャプチャできるbashスクリプト。
#!/bin/bash
while read input; do
for arg in $( echo $input ); do
match=$(echo "$arg" | grep -P '([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])' )
if [ "x${match}" = "x" ]; then
printf "%-s" "$arg "
else
dns=$( host $arg | tail -1 | awk '{print $NF}' 2>/dev/null )
if [ "${dns}" == "3(NXDOMAIN)" ]; then
printf "%-s" "$arg "
else
if [ "x${dns}" == "x" ]; then
printf "%-s" "$arg "
else
printf "%-s" "$dns "
fi
fi
fi
done
done
printf "\n"
出力は次のとおりです。
tk-air:~ tim$ echo "10:45 accessed by 8.8.8.8" | ./get-dns
10:45 accessed by FWDR-8.FWDR-8.FWDR-8.FWDR-8.
tk-air:~ tim$ echo "10:45 accessed by 8.8.8.8 26 times" | ./get-dns
10:45 accessed by FWDR-8.FWDR-8.FWDR-8.FWDR-8. 26 times
答え4
ログ形式が常に上記と同じように表示される場合は、次のコマンドを使用してこれを行うことができます。echo 10:45 accessed by 10.13.13.10|awk '{print $4}'|nslookup