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

jwb*_*ley 2 regex awk replace sed

我在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
Run Code Online (Sandbox Code Playgroud)

澄清; 在那里列出的第一个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个句号'.'

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

非常感谢.

det*_*zed 7

用主机名替换固定的IP地址:

$ cat log | sed -r 's/10\.224\.0\.2/example.com/g'
Run Code Online (Sandbox Code Playgroud)

用主机名替换所有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'
Run Code Online (Sandbox Code Playgroud)

如果你想调用外部程序,使用Perl很容易做到(只需host用你的查找工具替换):

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

希望这足以让你开始.