当匹配IP地址时,awk正则表达式不起作用

时间:2015-01-24 02:31:08

标签: regex awk ip-address

我想在文件中提取ip地址, 文件的每一行都是:

T   218.241.107.98  167.232.255.245 7   2719    1378473670  N   0   0   0   G   0   I   218.241.107.97,0.146,1  218.241.98.45,0.239,1   192.168.1.253,0.182,1   159.226.253.77,0.210,1  159.226.253.54,0.676,1  159.226.254.254,39.287,1    203.192.137.173,39.335,1    203.192.134.69,50.128,1 61.14.157.141,42.917,1  202.147.61.193,188.165,1    38.104.84.41,201.100,1  154.54.30.193,194.939,1 154.54.41.221,194.915,1 154.54.5.65,237.396,1   154.54.2.81,251.547,1   154.54.24.153,260.946,1 154.54.26.126,256.046,1 154.54.10.14,245.145,1  193.251.240.113,241.663,1   q   q   q   57.69.31.22,283.784,1;57.69.31.22,284.763,1

但我的awk脚本不起作用

#!/usr/bin/awk -f
BEGIN {
    FS = "[, \t;]"
}
{
    for(i = 4; i <= NF; i++) 
    {
        if ($1 == "#")
            continue
        if ($i ~ /(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}/)
            printf $i"\t"
        if (i == NF) 
            printf "\n"
    }
}

任何人都可以找出错误的原因吗?

提前感谢,任何帮助都会得到真正的帮助。

PS:没有输出但是换行符号

1 个答案:

答案 0 :(得分:0)

试试这个awk

awk -F"[, \t;]+" '!/^#/ {for (i=1;i<NF;i++) if ($i ~ /(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}/) printf "%s\t",$i;print ""}' file
218.241.107.98  167.232.255.245 218.241.107.97  218.241.98.45   192.168.1.253   159.226.253.77  159.226.253.54  159.226.254.254 203.192.137.173 203.192.134.69  61.14.157.141   202.147.61.193  38.104.84.41        154.54.30.193   154.54.41.221   154.54.5.65     154.54.2.81     154.54.24.153   154.54.26.126   154.54.10.14    193.251.240.113 57.69.31.22     57.69.31.22

!/^#/使其仅打印不以#

开头的行