使用 bash 将 IP 地址替换为其 whois

使用 bash 将 IP 地址替换为其 whois

我有类似这样的流量日志

2013-10-30 时 xxx.xxx.xxx.xxx 的“页面访问量”

我想用 whois 查询的结果来替换 ip 地址。

我可以将 IP 地址导出到单独的文件,然后在每一行上执行 whois,但我很难将它们全部组合在一起。

理想情况下,我想用同一个字符串替换 IP 地址,并将新字符串打印到新文件中。

所以它看起来像

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 地址及其相关主机名的列表,因此我要么需要在文件中搜索 IP 地址并将其替换为文件 b 中的文本(它将提供 IP 地址和主机名),要么就地替换 IP 地址。

谢谢

答案1

您不需要将 IP 地址保存到临时文件中。您甚至不需要使用,grep因为 Bash 3.2 及更高版本支持正则表达式(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 cat这样做,而应该使用while read -r

养成使用混合大小写或小写变量名的习惯,以避免与 shell 变量发生潜在的名称冲突。

相关内容