我有类似这样的流量日志
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 变量发生潜在的名称冲突。