我必須在bash,perl或python中編寫腳本。 我的文件有三列(對於手動管理連接代理)子網IP地址屬於哪個?
SUBNET/IP socks_port socks_ip
1.2.3.* 1080 9.8.7.6
1.1.* 1080 6.8.7.6
我想知道哪個子網所屬的IP地址, 例如:
$ my_script 1.1.1.2
該IP所屬1.1.*
子網所以我想回到第二線。
我必須在bash,perl或python中編寫腳本。 我的文件有三列(對於手動管理連接代理)子網IP地址屬於哪個?
SUBNET/IP socks_port socks_ip
1.2.3.* 1080 9.8.7.6
1.1.* 1080 6.8.7.6
我想知道哪個子網所屬的IP地址, 例如:
$ my_script 1.1.1.2
該IP所屬1.1.*
子網所以我想回到第二線。
BASH:快速和骯髒,使用cut
,然後grep
在文件上。
PYTHON:使用ip.rsplit()
,然後line.split()[].startswith()
遍歷該文件。
PERL:不知道。
乾杯!
如果文件的格式是給定的(即使用*),那麼使用bash模式匹配比較它與ip地址是相當容易的。但是,正如@Mark Drago所指出的那樣,除了八位邊界子網以外的任何格式,所以如果您需要支持任意的子網邊界,則需要更好的格式。
假設你正在使用的 「1.2 *」 格式,這應該工作:
#!/bin/bash
ip="$1"
found_match=false
while read subnet socks_port socks_ip; do
if [[ "$ip" == $subnet ]]; then # this'll do glob-style pattern matching against $subnet
echo "subnet=$subnet, socks_port=$socks_port, socks_ip=$socks_port"
found_match=true
break # assuming you don't want to check for multiple matches
fi
done </path/to/subnet/file
if ! $found_match; then
echo "No match found in subnet file"
fi
你需要支持非/ 8/16/24或/ 32子網?如果是這樣,這個x.x.x. *格式不適合你。例如,1.1.1.2/25和1.1.1.200/25都是1.1.1。*,但位於不同的網絡上。 – 2011-03-30 14:21:21