提前感谢您提出的任何想法。
我当前的项目让我尝试通过 geoiplookup 循环一个包含 1000 个 IP 地址列表的文件,并将其传送到 sed 以删除所有不符合条件的行。
该列表只是一个 IP 地址列表:
1.2.3.4
5.6.7.8
9.10.11.12
.
.
.
然后我geoiplookup ip.ad.dre.ss
以 root 身份运行,并得到:
[root@system ipset]# geoiplookup 4.2.2.2
GeoIP Country Edition: US, United States
如果 IP 在美国境内。
我的目标是,如果他们的 IP 不在美国,就从文件中删除所有行。
我尝试过的没有效果:
#!/bin/bash
for ip in $(cat /tmp/iplist.txt); do
geoiplookup $ip | sed '/GeoIP Country Edition: US, United States/!d'
done
有什么建议吗?如果能推荐其他方法,我们将不胜感激。
@terdon 抱歉我没有早点更新,我一直很忙。
向此问题或评论添加任何内容都会弄乱文本格式。抱歉,我是 Stack 的新手...让我来解决这个问题。
好的,更新。
更改并运行@terdon 的第一个代码后:
#!/bin/bash
while read ip; do
if ! geoiplookup "$ip" | grep -q ': US, United States$'; then
sed -i "/^$ip$/d" /tmp/iplist.txt
fi
done < /tmp/iplist.txt
它运行时没有错误,但非美国 IP 地址仍然在列表中。
我一直在使用最后一个例子declare -a badLines
scripts#geoiplookup 172.168.155.63
GeoIP Country Edition: GB, United Kingdom
scripts#grep 172.168.155.63 /tmp/iplist.txt
172.168.155.63
一旦我弄清楚如何让复制和粘贴直接作用于这里的问题,我就会更新。
@Ed Morton 这两个例子都在“done”行产生了同样的错误,一个是第 7 行,另一个是第 9 行。
./filter_ips.sh: line 7: syntax error near unexpected token `done'
./filter_ips.sh: line 7: ` done < "${@:--}"'
@Miri B 他们运行过了,但是列表中仍然有非美国的 IP 地址。