我需要验证文件中的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
我的档案有很多这些不好的范围,所以自动修正方式会很棒。
答案 0 :(得分:1)
HY,
您必须执行以下步骤:
以下脚本执行此操作:
#!/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。