我有一个类似于这个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 cat
做for i in cat
而是使用while read -r
。
使用混合大小写或小写variables名称是一种习惯,以避免潜在的名称与shellvariables的冲突。