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”是提交此日志条目的机器,登录尝试失败。有人试图从日志条目中第二个 IP 地址“10.224.0.58”的计算机登录,但失败了。

我希望将第一次出现的 IP 地址“10.224.0.2”替换为该机器的主机名,正如您目前看到的那样,它是“IPADDRESS/IPADDRESS”,两次拥有相同的信息是没有用的。所以在这里,我想grep(或类似地)输出第一个 IP,然后将其传递给类似host命令以获取反向主机并在日志输出中替换它。

我想对第二个 IP“10.224.0.58”重复此操作。我想找到这个 IP 并将其替换为主机名。

但是,不仅仅是这两个特定的 IP 地址,任何 IP 地址。所以我想搜索 1 到 3 之间的 4 个整数,用 3 个句号分隔。

正则表达式是前进的方向,还是使问题复杂化?

非常感谢。

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 地址,这里有一种。只需将 "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 回答
0

一起用谷歌搜索了这一行命令。但无法将创建的 IP 地址传递给 ssh 命令:

sed -n 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/\nip&\n/gp' test | grep ip | sed 's/ip//' |   sort | uniq

“测试”是 sed 命令正在搜索模式的文件

于 2013-07-04T11:11:28.693 回答