00:00
大家好,欢迎大家继续收看上硅谷的云计算课程。我是沈涛老师。这节课呢,我们继续来学习for循环,那上节课我们讲了一下批量解压缩的这样两个脚本,对吧?啊,我们用了这样两种方法,那我们这节课呢,我们写一个稍微复杂一点的。我们同样用两种语法来写这样的脚本,那就是这最后一次了,后面再写我可能就不会再对比两种语法的区别了,那两种语法对比是非常浪费时间的,所以我们就再写一个就行,那我写一个干嘛?写一个脚本我们用来判断合法IP地址。各位,前面我们说了啊,IP这东西很讨厌,它是三个数,就是说,但是它不是是从一到999,它的数四个数,第二个分开了,它是从一到255。对吧。那那是不是就是11.1.1呃1.0.0.0~2525对吧,4.25.25对吧,那我们说啊各位他的IP范围是这样的一个范围,那我们说正则过滤起来很痛苦。
01:10
呃,虽然前面我也给大家写了。这个当然不是我写的,是咱们编程的学员写出来了,但是我说像这样的东西其实反而写脚本更好理解,那我们就写一个脚本来过滤合法IP啊,那我同样有两种语法,两种都写一遍,同样还是要告诉你什么明显的第一种语法,就是这种看起来更笨的语法,更简单,它更适合写十尔脚本啊,那我们先来写第二种语法,也就是这种比较复杂的语法,各位这个东西啊,我们都事先写好,为啥?手工写太浪费时间了,真要敲一遍,光敲一遍可能就得20多分钟,你还得再讲,所以我提前写好,节约时间啊,然后呢,那我们说脚本开头,然后先用正则做一下粗过滤。各位。我这里边在这个IPT里边,我准备了一些IP看啊,我提前准备好了啊,我现在就在这个root下SH下有一个ip.txt我们看一下,那这里边儿我们能够看到的是这个是合法的,这个两个是。
02:15
这个不是超过二百二百五万,这个不是四个数,这个也超过255了,这只有三个数,那这个是合法的,应该只有这三个合法IP,我想通过脚本把合理IP给剔除出来,把不合理的全部给删掉啊,这就是这个作用,那首先我通过一个正则做一个粗过,这个的意思就是啥?看这个正则就以数字零到九重复三个数开头。然后以零到九重复三个数结尾,然后点三个数,也就是说它能过滤的是0.0~999。点零到999。哎,999,哎,零到999,哎,然后呢,零到999,它能过滤出来四个数,四个零到999的数,但是它再写的话就很麻烦了,所以我觉得写12脚本反而更方便,所以我说先用它过于滤一遍粗过滤。
03:10
也就是说把明显的不是四个数了。比如说你一个数的,三个数的,你看我们这里是不是有三个数的,一个数的,是不是先把它乘置给过滤掉,保证我在这个TEST1里看啊,先gra从这里找,只要符合这个条件的内容,把它写入TEST1,那也就说在TEST1里是粗过率之后来拼,最少它是四个数,零到999的数。那那我把三个的两个的先过滤掉,所以先用正则做一遍粗过滤,各位,那我一直说正则其实主要还是用于就是做粗过滤,精细过滤还是要通过程序来完成啊好了,那这样的话,在T1里保存的就是我们的粗过滤之后的IP了,把那个三个数的一个数的是不是就先过滤掉了,然后。
04:03
开始统计有多少行。各位这里啊,为什么先要还要用a wp截取一下经D列,那我们看一下你就知道了,你看啊,我们先统计,比如说我们就统计IP吧,统计IP有多少行,这个IP这个文件有多少行,你看它会显示有多少行,后面还会写一下这个。文件瓶儿。这个就比较讨厌了,所以看我这里干嘛加了管道符交给aw k,然后呢,打印一下第一列,换句话说就是截取的是第一列。这样的话是不是就是行号了。对吧,这就是这里的作用,为什么要加个J,所以在变量当中保存的就是有多少行,当然我说为什么呢?我说其实这样就更方便了,K直接用WC来统计。这样出来就直接是行号,不用再记,两种写法都行,哎,所以你记得吧,我前面写那个批量解压缩的时候,我是通过这样的方式统计了,原因就是啊,直接统计它会显示文件名,还必须要截一下,那我说这两种方法都行,看你随便你用哪一个,我这里用的是这种方法,上面这种啊,那不论怎么说,变量烂烂当中保存的就是我有多少个,这个文件里有多少个IP,对吧,我先粗过滤,把明显不合适的给过滤掉,然后统计这里边有多少个IP,有多少个IP干嘛用来循环多少次。
05:30
对不对啊,好其次啊。我还把最终看IO的一个空文件覆盖进去,这个文件目的是为了这个是我最终保存合理IP的文件,哎,前面这些test文件后面还会有个TEST2,都是临时文件,用完我就删掉,里面保存的都是粗过滤之后的文件,而这个里边保存的就是最终写入的文件。那我先把它清空一下,免得为啥我的程序有可能到时候后面会重复运行,那我如果不清空它里面肯定得追加嘛,那这样的话是不是IP就会重复写进去,容易干扰,所以我先清空一下,我最终保存文件啊,这个是常用常用技巧,经常有这样的做法。
06:12
好,然后开始用第一种循环,For I。到到了line当中,这个有多少行循环多少次,每次循环这个,然后后边这个加,一直到它比它多为止,对吧,好循环多少次见过。然后看。每次循环之后。把这一行的数据,哎,到来I当中是不是第一次循环,I是一,那是不是就当相当于打印第一列对吧?看把这个第一次临时脚本里的内容。读出来,然后打进基金列保存在。这个第二个历史脚本当中为啥。这样的话,第二个临时脚本当中只有一行数据,哎,每次循环就是第一次循环就里边放的是第一个IP,第二次循环放的是第二第二个IP,第三次循环第三个IP,这里面是每次循环放入了一个IPOK,然后开始截各位我们可以看到是啥。
07:10
读取这个里边的这个行列数据,截取第一列赋予A变量A,第二列赋予变量B,第三列赋予变量C,啥意思?我们的IP是这样的嘛,幺九二点幺六八点零点一百对不对?那我现在要做的就是把第一个数附到变量A当中。第二个数负的变量B,第三个变量CD,四个变量B,然后呢,附进来之后啊,目的是什么?前面我们是不是只过滤了粗过滤保证的是这里面这些临时文件一是这个四个IP对吧,但是IP的范围是一到255啊。而我们粗过滤,过滤出来的是一到299,一到999啊,对不对,是零到999啊,那这个时候我把每个数附在变量ABC当中,我开始看嘛看。
08:02
如果第一个数小于一或者大于255,终止循环。各位,Continue这个我们后面没有讲,我们后面会讲到CONTINUE7的作用是如果碰到continue,如果碰到CONTINUE7,这次循环跳出本来I等于一,然后开始往下处理,对吧?只要碰到肯奇九,这个循环就结束了,然后第二次循环,但是不是说把整个循环全部结束,只是循环了这一次,终止了这一次循环啥意思啊?比如说我这里有十个IP,我在line变量当中。保存的是十个数对吧?I第一次是不是一,第二次是二,第三次是三,直到是不是它小于这个大于十是不是才会终止循环,那如果碰到肯,那I等于一的这次循环就不再继续了,那接下来回头开始干嘛,I等于二。开始循环,哎,那也就是说我只要判断这个IP不是一个正常范围,各位我的第一个IP应该是什么一吧。
09:04
哎,一点最小IP是不是1.0.0.0~255.255.25。对不对。对不对,所以如果小于一,那也就说它是零,那这个数就不应该运行大于255,也就是256,那这个家伙就不对,那你这个IP就不是靠IP对吧?那如果你是在这个范围,也就说既是大于等于一,小于等于255,那么这个F循环就不执行这个操作了,对吧?我这里判断的是看小于一大于等于255。对不对,那这种情况下干嘛就退出了,那如果不在这个范围啊,其实大于啊,不是大于等于,大于等于是杠之一啊,我们是大于啊,就是大于这块这个注释这写的有问题啊,那如果在这个范围之内,那这个这个Z的这个条件是不是就不执行。对吧,哎,我们这里写的是看小于大于对吧,那如果满足这两个条件之一,则执行这个工作,那如果不满足,也就是说我的范围是一到255的话。
10:11
则这个就不退出啊,不退出就证明第一个数是合法的,然后开始判断第二个数,哎,第二个数就可以变成零了,因为我们说AP是1.0.0。开始这个开始,所以第二个数就是小于零就不行,哎,那也就说这个就出现负数肯定就不行,同样大于255不行对吧,那最大IP还是255减二五减二五对不对,那这块啊小心啊,这两个数不太一样,第一个是小于一,因为第一个数不能是零,后面这三个数可以是零。可以,所以它后面判断的就是小于零,看到了,那同样如果在这个范围,如果是小于零的,或者大于255退出循环,如果不不是,那么就继续执行判断这三个数。接下来判断这四个数对不对,我们的事儿,程序或者所有的程序都会是顺序执行的。
11:07
如果这三个这四个数abcd里保存的这四个数有一个数不对,这个肯定就运行,这个循环就终止了,看我后面写的这个,把IP,把这个IP写入合法IP的这个文件当中,是在循环里。看循环down在这儿结束了,换句话说,上面有任何一个数发现不对,肯定运行这个直接就跳出循环了,最后这个IP这个把这个把TEST2当中IP写入到这个最终IP地址的这个工作,它就不运行,对吧,只有前四个都执行完。哎,他判断这个范围没在这个范围,然后肯亲有没有执行这句话,是不是财会运行。换句话说,我如果这句话运行了,就证明我前面A。BCD4个数判断完了,都判断了,那这四个数都在我的合反IP范围之内,那这个时候循环才没有终止,循环没有终止才会运行到最后这句语句,然后这句话才会运行,才会运行,这里边我们说了,是不是保存的是单个的一个IP,我第一次循环里面放的就是第一个IP,第二次循环放的是第二,第三次是不是放第三个,那证明这个IP,如果它上面都终止过来了,运行到这里了,证明这个IP是合法的,把它写进来就可以了。
12:30
那如果前面有任何一个数不合法,比如说第四个数不合法,到这儿就直接运行,肯九就跳出去了,从这儿就直接返回,从头开始了,那这句话是不是就不会执行,哎,你记得啊。这个程序都还是顺序执行的,除非有这种,比如说我们说的这种循环啊,或者跳出循环啊,这种更改流程的这种语句,否则它都应该是顺序执行的,所以啊,我们用的是这个原理,那也就是说。前面只要没有套,跳出循环到这句话运行的话,那就证明abcd这四个数已经是合法数了。
13:08
这个时候这里面写入了就是我们的真正的有效IP了,好,那最终把这两个临时文件删掉,那这里面放入的就是我们的有效IP文件。好,那这就是整个这个文件的内容啊,这个脚本的内容各位同样啊。这个地方如果要用这种循环,它就有两个难点。第一个就是。需要统计你IP总共有多少个对吧?所以是不是先要统计这个里边有多大,然后才是不是才能确定循环多少次,第二个难点就是同样一样,我是不是要提取你指定的行对吧?到第一次是不是提取第一行IP,第二次提取第二行,第三次提取第三行对不对,保存在文件里,是不是再进行剪切对吧?这是用这种循环你必须要面对的两个问题,哎,我们说了,第一个就是确定循环多少次,第二个就是每次循环提取出指定的这个行数,指定的这个行的这个数据才可以进行运算。
14:05
好,各位能用吗?能啊,我们试一下来,我直接粘贴了,节约时间。好。我把它复制一下,那我们写一下。viip1.sh把它粘起来,然然后呢,称之梦的其5IP一点,让它拥有执行权限,第个ip1.ish好了,执行完没有任何报错,我们看一下看这个时候就出现了,我最终IP文限看见了,我是不是就把这个看。我们看一下我最终是不是把这个合理IP是不是就写入了这个文件当中,那这证明这里这里边放的是不是都应该是合法一批了,对吧?那这个时候我们看一下,看一下IP下划线来看三个合法IP,那我们再看看原始数据啊,原始的看原始我们说了只有这仨。
15:01
是合法的对吧,剩下的是不是都不是合法IP没问题吧,好,那这是第一个。IP脚本,判断合法IP的脚本,各位,那我们说这个脚本其实还是很复杂的原因啊,其实本身这个程序就稍微复杂一点,其次呢,我们又用了这种循环,它需要确定循环的个数,同时每次循环要读取里面的内容,对吧?那好,那我们再看看,如果用第一种语法格式,这个是不是就更合理一点,来,我把这个临时文件删一下,我就不要这个,就是这个文件,最终的这个文件我们待会儿可能还会再写,所以我不要它了。那脚本文件留了,原始这个IP文件我留了,那好,我们。好,那我们开始看第二个脚本程序,那我们看第二个语法一的格式,那这个就要明显要简单一些,但是同样也要判断同样啊,首先。过滤出过滤,把明显不符合四个数的这个四个零到999的这个数的IP过滤掉,放在临时文件一里。
16:06
然后把最终文件给清空,哎,我这会为了跟第一个脚本出这个这个不要冲突,所以我换了一个写法,IP_value啊,这里面会最终保存我们的有效IP。同时看用这种循环,就是不是不再需要你确定我这个循这个这个文件里有多少行,对吧,也不再需要你按照循环,第一次循环提取第一行,第二次提取第二行不需要了,直接是不是就是for IE这里面有多少个。有多少行数据就循环多少次,每次循环把数据是不是附在变量I当中,对吧?那我甚至也不用再把它写入文件了,把变量I我直接就可以看A口到,然后提取第一列附在变量A当中,那也就说A里面第一次循环。这里面是不是就是第一个IP附在了变量I当中对吧?然后把第一列,也就是第一个数附在变量A,第二个数附在变量B,第三个数附在变量C,对不对?那ABC里是不是同样保存的是第一个IP的123个数,1234个数对吧?然后接下来同样判断一样的第一个数是否小于一小大于255,如果是。
17:20
退出群关。第二个数是不是小于零大于255,然后同样如果这里肯奇没有退出相关,这里就是合法IP,则把它写入到最终IP文件里,这里边就保存的是最终IP了。然后如果。哎,那我们就可以直接执行了,来我们试试,那我们可以看到它是不是叫同样的脚本。我们先执行一下怎么样ip2.sh。好,那我们可以看一下,那我们先执行一下行了。把这个把这个临时文件删一下,呃,Root下的SH下的iptest1.t啥意思啊,我这里看是不是会把这个出过滤之后呢,保存在这个临时文件里,那这个临时文件是没有用的,对吧?那我把它最终处理完之后,我是不是就把零收零件删掉,我真正保存的是不是就是在这里对吧?好。
18:19
保存一下,然后执行。IP2,然后我们IP2加点杠。二加SH来,我们可以看到这个和反应AP过滤的是不是也出现了对吧,我们看一下里面的值。哎,同样是不是三个质点过滤出来了,好,这个脚本是K进去了,没错吧,那好啊各位。又是这样啊,同样功能的脚本我写了两遍,用了两种不同的循环,那我们还是能感觉到这种循环。也就是我们在文档上的这个语法一,这种循环是不是明显的要更合理,对吧,用这种循环,它是不是就不用先统计有多少个,有多少行,你是不是才能知道循环多少次,它是有多少个值,就自动循环多少次了,不用你再判断。
19:08
然后也不用在每第一次循环的时候,把第一个值附在变量当中,第二次循环的时候再把第二行的值附进来,不用它自动的是不是就是第一次循环第一个是负的变量,第二次第二次负的变量对吧,所以我一直说各位。其实我们在一开始接触12编程的时候,这个循环我们觉得非常脑袋疼,为啥这跟其他语言的循环都不一样?一开始都觉得这个循环老他妈二了,为啥我们根深蒂固的认为我要循环1000次怎么办,对吧?但是用多了之后发现这种循环才是更适合我们做12脚本的循环,它要远比写第二种循环要方便简单,所以啊各位我举了两个例子啊,一个是批量解缩,一个就是这个过滤IP,当然这个都是我们这个,呃,这个写出来了,我用这两种方法,我每一个我都写了两遍,用不同的循环来做,那我们要求大家理解的就是。
20:06
为什么我们说这种循环更适合十二编程,OK?那后面再写啊,我们可能就不会再写两遍了,这个你们如果愿意可以自己来改写,OK,其实基本变化就这样了啊好,那我们这节课呢,就到这里,我们下节课再见。
我来说两句