linux +仅将VALID IP从文本文件转换为其他文件

请build议如何仅匹配file.txt中的有效IP(255.255.255.255),并只将有效IP插入VALID_IP.txt文件

  • (例如,参见VALID_IP.txt)

解决scheme应该在我的ksh脚本中实现(所以perlsedawk也可以)

更多file.txt

e32)5.500.5.5*kjcdr ##@$1.1.1.1+++jmjh 1.1.1.1333 33331.1.1.1 @5.5.5.?????? ~3de.ede5.5.5.5 1.1.1.13444r54 192.9.30.174 &&^#%5.5.5.5 :5.5.5.5@%%^^&* :5.5.5.5: **22.22.22.22 172.78.0.1()*5.4.3.277 

VALID_IP.txt文件的例子

  1.1.1.1 192.9.30.174 5.5.5.5 5.5.5.5 5.5.5.5 22.22.22.22 172.78.0.1 

以下是一个合适的正则expression式,为了我自己的理智,分成4个不同的行。

 (1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\. (1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\. (1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\. (1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]) 

输出:

 egrep -o `cat regex` infile #all regex lines above joined, no spaces 1.1.1.1 1.1.1.133 31.1.1.1 5.5.5.5 1.1.1.134 192.9.30.174 5.5.5.5 5.5.5.5 5.5.5.5 22.22.22.22 172.78.0.1 5.4.3.27 

显然这不符合你的例子。 为什么? 因为我们不能说一个3不属于一个。 正如你所看到的,垃圾数字不能被干净地猜到。

用perl稍微清洁一点

 #!/usr/bin/perl use Regexp::Common qw/net/; while (<>) { print $1, "\n" if /($RE{net}{IPv4})/; } 

但仍然有误报

 1.1.1.1 1.1.1.133 31.1.1.1 5.5.5.5 1.1.1.134 192.9.30.174 5.5.5.5 5.5.5.5 5.5.5.5 22.22.22.22 172.78.0.1 

Perl一个class轮

 perl -e 'use Regexp::Common qw/net/;while (<>) {print $1, "\n" if /($RE{net}{IPv4})/;}' infile 

我build议使用范围检查,而不是毛茸茸的正则expression式。 你可以用ksh做这个,而不需要使用外部工具或其他语言。 虽然Iain的解决scheme很好,但它不是核心模块。

这是纯粹的ksh。 没有必要把它作为一个单线,只是使用一个函数。 这样的代码更容易理解,更容易检查正确性,更容易维护。

 #!/usr/bin/ksh validate_ip () { typeset ip=$@ typeset IFS=. valid=1 typeset octets=($ip) octet typeset digits='^[[:digit:]]+$' if (( ${#octets[@]} == 4 )) then for ((octet = 0; octet <= 3; octet++)) do value=${octets[octet]} if [[ ! "$value" =~ $digits ]] || ((value < 0 || value > 255)) then valid=0 fi done else valid=0 fi if ((valid)) then printf '%s\n' "$ip" fi return $valid } while read -r line do validate_ip "$line" done #< file.txt > VALID_IP.txt 

这是ksh 93,我没有在ksh 88中testing过。它在Bash 3.2或更高的版本中也没有变化。