我在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个句号分隔'。'
正则表达式是前进的方向,还是使问题复杂化?
非常感谢。
答案 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命令搜索模式的文件