用它的whoisreplace一个IP地址使用bash

我有一个类似于这个stream量日志

在2013-10-30对“xxx.xxx.xxx.xxx”的“网页访问”

我想用它的whois查找来replaceip地址。

我可以将IP地址导出到一个单独的文件,然后在每一行做一个whois,但我正努力将它们结合在一起。

理想情况下,我想要replace相同的string中的IP地址,并将新的string打印到一个新的文件。

所以它看起来像

example.com在2013-10-30的“网页访问”

任何人都可以帮忙

这是我迄今为止

grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' clean_cites.txt > iplist.txt for i in `cat iplist.txt` do OUTPUT=$(geoiplookup -f /usr/share/GeoIP/GeoIPOrg.dat $i) echo $i,$OUTPUT >> visited.txt done 

正如我所说,这产生了一个单独的文件,其中包含一个IP地址列表及其相关的主机名,所以我要么search文件中的IP地址,并将其replace为文件B中的文本(这将给出IP地址和主机名)或replaceIP地址。

谢谢

您不需要将IP地址保存到临时文件。 你甚至不需要使用grep因为Bash 3.2和更高版本支持正则expression式(3.1也可以,但是3.2中的特性被改变了)。

 #!/bin/bash ip_pattern='([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' while read -r line do [[ line =~ $ip_pattern ]] ip=${BASH_REMATCH[0]} domain=$(geoiplookup -f /usr/share/GeoIP/GeoIPOrg.dat "$ip") echo "${line//$ip/$domain}" # substitute the domain for the ip in the original line done < clean_cites.txt > outputfile.txt 

这应该运行得更快,因为你不必为每一行产生grep ,而且你不必迭代文件两次(或两个或多个文件)。

顺便说一句,你不应该for i in catfor i in cat而是使用while read -r

使用混合大小写或小写variables名称是一种习惯,以避免潜在的名称与shellvariables的冲突。