【现学现忘&Shell流程控制】— 47.for循环练习1
2020-11-04 本文已影响0人
繁华似锦Fighting
5、练习:判断合法IP地址脚本
准备:ip.txt
文件中存放着一些IP地址,我们用脚本来判断其中的合法IP地址。
[root@localhost sh]# cat ip.txt
192.168.1.200
202.106.0.20
300.36.190.5
222222222222
192.168.1.300
200.2.2
192.168.100.100
方式一:
#/bin/bash
# 先通过正则,进行粗过滤。
# 把明显不符合规则的ip过滤掉,把初步符合的结果保存在ip_test1.txt临时文件中,
# 粗过滤0-999的1到3位数。
grep "^[0-9]\{1,3}\.[0-9]\{1,3}\.[0-9]\{1,3}\.[0-9]\{1,3}$" /root/sh/ip.txt>/root/sh/ip_test1.txt
# 创建一个ip_test.txt文件,用于保存最终合法的IP地址
# 下面这条命令是创建并清空一个文件,
# 也就是如果存在ip_test.txt文件,就清空,没有则创建。
echo "" > /root/sh/ip_test.txt
# 开始对每一个IP地址的合法性进行判断
for i in $(cat /root/sh/ip_test1.txt)
do
# 1.分别把IP地址的四个数值分别读入变量a,b,c,d
a=$(echo "$i" | cut -d "." -f 1)
b=$(echo "$i" | cut -d "." -f 2)
c=$(echo "$i" | cut -d "." -f 3)
d=$(echo "$i" | cut -d "." -f 4)
# 2.依次判断四个IP数值是否超出范围,如果超出,退出本次循环。
# ip中的每一个字段是否在0-255之间。
# 第一个字段是1-255之间。
# 如果第一个数值小于1或大于255.
if [ "$a" -lt 1 -o "$a" -gt 255 ]
then
# 则退出本次循环
continue
fi
# 如果第二个数值小于0或大于255.
if [ "$b" -lt 0 -o "$b" -gt 255 ]
then
# 则退出本次循环
continue
fi
# 如果第三个数值小于0或大于255.
if [ "$c" -lt 0 -o "$c" -gt 255 ]
then
# 则退出本次循环
continue
fi
# 如果第四个数值小于0或大于255.
if [ "$d" -lt 0 -o "$d" -gt 255 ]
then
# 则退出本次循环
continue
fi
# 3.把合法IP地址写入/root/sh/ip_test.txt文件。
echo "$i" >> /root/sh/ip_test.txt
done
# 删除临时文件
rm -rf /root/sh/ip_test1.txt
方式二:
#/bin/bash
# 先通过正则,粗过滤。
# 把明显不符合规则的ip过滤,把符合的结果保存在ip_test1.txt临时文件中
# 粗过滤,过滤0-999的1到3位数
grep "^[0-9]\{1,3}\.[0-9]\{1,3}\.[0-9]\{1,3}\.[0-9]\{1,3}$" /root/sh/ip.txt>/root/sh/ip_test1.txt
# 统计ip_test1.txt文件中有几个IP。
# 为什么还要执行awk '{print $1}'命令:
# 因为wc -l命令执行完后统计结果出来后,还会跟有该文件的文件名如果:
# [root@localhost sh]# wc -l /root/sh/ip_test1.txt
# 8 ip.txt
# 所以要通过awk命令截取第一列数据。
line=$(wc -l /root/sh/ip_test1.txt | awk '{print $1}')
# 提示:用 line=$(cat /root/sh/ip_test1.txt | wc -l)的方式写,
# 就不需要用awk命令截取第一列数据了。
# 创建一个ip_test.txt文件,用于保存最终合法的IP地址
# 下面这条命令是创建并清空一个文件,
# 也就是如果存在ip_test.txt文件,就清空,没有则创建。
echo "" > /root/sh/ip_test.txt
# 对每一个IP地址的合法性进行判断
# 有几行IP,循环几次
for(( i=1 ; i<=$line ; i=i+1 ))
do
# 1.先分别获取到IP地址的四个数字
# 第几次循环,就把第几行读入ip_test2.txt文件(此文件中只有一行IP)
cat /root/sh/ip_test1.txt | awk 'NR=='$i'{print}' >/root/sh/ip_test2.txt
# 分别把IP地址的四个数值分别读入变量a,b,c,d
a=$(cat /root/sh/ip_test2.txt|cut -d '.' -f 1)
b=$(cat /root/sh/ip_test2.txt|cut -d '.' -f 2)
c=$(cat /root/sh/ip_test2.txt|cut -d '.' -f 3)
d=$(cat /root/sh/ip_test2.txt|cut -d '.' -f 4)
# 2.依次判断四个IP数值是否超出范围,如果超出,退出本次循环。
# ip中的每一个字段是否在0-255之间。
# 第一个字段是1-255之间。
# 如果第一个数值小于1或大于255.
if [ "$a" -lt 1 -o "$a" -gt 255 ]
then
# 则退出本次循环
continue
fi
# 如果第二个数值小于0或大于255.
if [ "$b" -lt 0 -o "$b" -gt 255 ]
then
# 则退出本次循环
continue
fi
# 如果第三个数值小于0或大于255.
if [ "$c" -lt 0 -o "$c" -gt 255 ]
then
# 则退出本次循环
continue
fi
# 如果第四个数值小于0或大于255.
if [ "$d" -lt 0 -o "$d" -gt 255 ]
then
# 则退出本次循环
continue
fi
# 3.如果四个IP数值都符合要求,则把合法IP记录在ip_test.txt文件中。
cat /root/sh/ip_test2.txt>>/root/sh/ip_test.txt
done
# 删除临时文件
rm -rf /root/sh/ip_test1.txt
rm -rf /root/sh/ip_test2.txt
总结:
还是方式一的for循环格式书写脚本比较方便。