Ip
如何過濾 IPv4 和 IPv6 地址?
echo "1.1.1.1" | awk '/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/ {print $1}'
如何過濾腳本中的 IPv4 地址,以及如何過濾 IPv6 地址。
我的意思是更準確地說,所以 oneliner 應該只輸出 VALID IPv4 地址或另一個腳本以僅輸出 VALID IPv6 地址。用不同的語言?比如:awk,perl?
泰!
IPv4和IPv6地址有幾種常用的表示法。這是一個擴展的正則表達式,適用於 Perl
m//x
,它擷取了通常的符號。如果刪除註釋和空格,則可以將其與grep -E
、awk
或任何其他使用擴展正則表達式 (ERE) 的實用程序一起使用。^( ([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]|0+[0-3][0-7][0-7]|0x0*[0-9a-fA-F][0-9a-fA-F]) (\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]|0+[0-3][0-7][0-7]|0x0*[0-9a-fA-F][0-9a-fA-F])){3} # IPv4 dotted quad | 0x[0-9a-fA-F]{1-8} # IPv4 hexadecimal | 0+[0-9]{0-10} | 0+[1-3]{11} # IPv4 octal | [1-9][0-9]{1-8} # IPv4 decimal, small | [1-3][0-9]{9} # IPv4 decimal, medium | 4[0-9]{9} # IPv4 decimal, large (needs a further range check) | [0-9a-fA-F]{1-4}(:[0-9a-fA-F]{1-4}){7} # IPv6 with all groups | ([0-9a-fA-F]{1-4}:){1-1}(:[0-9a-fA-F]{1-4}){1-6} # IPv6 with 1-6 middle groups omitted | ([0-9a-fA-F]{1-4}:){1-2}(:[0-9a-fA-F]{1-4}){1-5} # IPv6 with 1-6 middle groups omitted | ([0-9a-fA-F]{1-4}:){1-3}(:[0-9a-fA-F]{1-4}){1-4} # IPv6 with 1-6 middle groups omitted | ([0-9a-fA-F]{1-4}:){1-4}(:[0-9a-fA-F]{1-4}){1-3} # IPv6 with 1-6 middle groups omitted | ([0-9a-fA-F]{1-4}:){1-5}(:[0-9a-fA-F]{1-4}){1-2} # IPv6 with 1-6 middle groups omitted | ([0-9a-fA-F]{1-4}:){1-6}(:[0-9a-fA-F]{1-4}){1-1} # IPv6 with 1-6 middle groups omitted )$
如果是十進制值,您需要進一步檢查範圍(您可以對其進行正則表達式,但它會很大):
if (!/[^0-9]/ && /^[^0]/) { # if it's a decimal number die if $_ > 4294967295 # reject numbers above 2^32-1 }
如果你使用的工具只支持 32 位數字,那麼只有以 4 開頭的數字才可以進行測試,並在進行檢查之前將 4 去掉。
if (!/[^0-9]/ && /^4/) { # if it's a decimal number beginning with 4 my $tmp = $_; $tmp =~ s/^4//; die if $tmp > 294967295; }