Bash脚本:sed / awk / regex匹配IP地址并替换

时间:2012-10-25 12:35:34

标签: regex replace sed awk

我在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”中第二个IP地址的计算机登录并失败。

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

我想重复第二次IP“10.224.0.58”。我想找到这个IP,并用主机名替换它。

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

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

非常感谢。

3 个答案:

答案 0 :(得分: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'

希望这足以让你开始。

答案 1 :(得分:1)

有多种方法可以找到IP地址,这是一个。只需替换“printf'<<<<%s>>>' “with”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

答案 2 :(得分:0)

用google搜索这一行命令。但无法将创建的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

“test”是sed命令搜索模式的文件