使用bash验证IP范围

时间:2016-02-13 22:45:32

标签: bash sed grep

我需要验证文件中的IP范围并更正它们。

文件有这些不好的范围:

192.168.1.2-192.168.1.1
10.0.0.10-10.0.0.8
172.16.0.9-172.16.0.5

问题是结束地址不能在起始地址之前出现,应该更正为:

192.168.1.1-192.168.1.2
10.0.0.8-10.0.0.10
172.16.0.5-172.16.0.9

我的档案有很多这些不好的范围,所以自动修正方式会很棒。

2 个答案:

答案 0 :(得分:1)

HY,

您必须执行以下步骤:

  1. 阅读每一行
  2. 拆分ips中的当前行
  3. 对两个ips进行排序
  4. 回显已排序的ips
  5. 以下脚本执行此操作:

    #!/bin/bash
    
    filename="$1"
    #Step1: read each line from file
    #see http://stackoverflow.com/questions/10929453/bash-scripting-read-file-line-by-line
    while read -r line
    do
        #Step2: split each line in ips
        #see http://stackoverflow.com/questions/10586153/split-string-into-an-array-in-bash
        IFS='-' read -r -a array <<< "$line"
    
        #Step3: sort the ips
        #see http://stackoverflow.com/questions/7442417/how-to-sort-an-array-in-bash
        #for sorting ips see: https://www.madboa.com/geek/sort-addr/
        IFS=$'\n' sorted=($(sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 <<<"${array[*]}"))
        unset IFS
        #Step4: echo the results
        echo ${sorted[0]}"-"${sorted[1]}
    done < "$filename"
    

    以下文件的结果:

    192.168.1.2-192.168.1.1
    10.0.0.10-10.0.0.8
    172.16.0.5-172.16.0.9
    

    是:

    192.168.1.1-192.168.1.2
    10.0.0.8-10.0.0.10
    172.16.0.5-172.16.0.9
    

答案 1 :(得分:1)

根据您的样本输入/输出,您只需要使用GNU awk for gensub():

$ awk -F- {print (gensub(/.*\./,"",1,$1) < gensub(/.*\./,"",1,$2) ? $1 FS $2 : $2 FS $1)}' file 
192.168.1.1-192.168.1.2
10.0.0.10-10.0.0.8
172.16.0.5-172.16.0.9

使用其他awks只需使用几个本地变量和sub()。

但是,如果你需要一个解决方案,当IP地址的某些其他部分而不仅仅是最后一个部分在给定的行(例如172.16.0.5-172.15.0.9)上可能不同时,那么这将适用于任何awk:

$ cat tst.awk
BEGIN { FS="-" }
{
    split($1,t,/\./)
    beg = sprintf("%03d%03d%03d%03d", t[1], t[2], t[3], t[4])

    split($2,t,/\./)
    end = sprintf("%03d%03d%03d%03d", t[1], t[2], t[3], t[4])

    print (beg < end ? $1 FS $2 : $2 FS $1)
}

$ awk -f tst.awk file
192.168.1.1-192.168.1.2
10.0.0.8-10.0.0.10
172.16.0.5-172.16.0.9

$ echo '172.16.0.5-172.15.0.9' | awk -f tst.awk     
172.15.0.9-172.16.0.5

如果您正在考虑使用shell循环来操作文本,那么请务必先阅读并完全理解https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice