2

次のようなログエントリの行を含む文字列がbashスクリプトにあります。

Oct 24 12:37:45 10.224.0.2/10.224.0.2 14671: Oct 24 2012 12:37:44.583 BST: %SEC_LOGIN-4-LOGIN_FAILED: Login failed [user: root] [Source: 10.224.0.58] [localport: 22] [Reason: Login Authentication Failed] at 12:37:44 BST Wed Oct 24 2012

明確にするために; そこにリストされている最初のIP「10.224.0.2」は、ログイン試行に失敗した、このログエントリを送信したマシンでした。ログエントリ「10.224.0.58」の2番目のIPアドレスにあるマシンから、誰かがログインしようとして失敗しました。

IPアドレス「10.224.0.2」の最初の出現をそのマシンのホスト名に置き換えたいと思います。現在、同じ情報を2回持つことは役に立たない「IPADDRESS/IPADDRESS」です。したがって、ここではgrep、最初のIPを(または同様に)出力してから、コマンドのようなものに渡してhost、リバースホストを取得し、ログ出力で置き換えます。

2番目のIP「10.224.0.58」についてもこれを繰り返したいと思います。このIPを見つけて、ホスト名に置き換えたいのですが。

ただし、これら2つの特定のIPアドレスだけでなく、任意のIPアドレスです。したがって、3つの終止符'。'で区切られた1から3までの4つの整数を検索したいと思います。

正規表現はここで前進するのでしょうか、それとも問題を複雑にしすぎているのでしょうか。

どうもありがとう。

4

3 に答える 3

7

固定 IP アドレスをホスト名に置き換えます。

$ cat log | sed -r 's/10\.224\.0\.2/example.com/g'

すべての IP アドレスをホスト名に置き換えます。

$ cat log | sed -r 's/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/example.com/g'

外部プログラムを呼び出したい場合は、Perl を使用して簡単に実行できhostます (ルックアップ ツールに置き換えるだけです)。

$ cat log | perl -pe 's/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/`host \1`/ge'

うまくいけば、これで十分です。

于 2012-10-25T12:47:57.563 に答える
1

IP アドレスを見つけるにはさまざまな方法がありますが、ここではその 1 つを示します。「printf '<<<%s>>>'」を「host」またはこの GNU awk スクリプト内のコマンド名に置き換えるだけです。

$ cat tst.awk
{
    subIp = gensub(/\/.*$/,"","",$4)
    srcIp = gensub(/.*\[Source: ([^]]+)\].*/,"\\1","")

    "printf '<<<%s>>>' " subIp | getline subName
    "printf '<<<%s>>>' " srcIp | getline srcName

    gsub(subIp,subName)
    gsub(srcIp,srcName)

    print
}
$
$ gawk -f tst.awk file
Oct 24 12:37:45 <<<10.224.0.2>>>/<<<10.224.0.2>>> 14671: Oct 24 2012 12:37:44.583 BST: %SEC_LOGIN-4-LOGIN_FAILED: Login failed [user: root] [Source: <<<10.224.0.58>>>] [localport: 22] [Reason: Login Authentication Failed] at 12:37:44 BST Wed Oct 24 2012
于 2012-10-25T13:04:48.807 に答える