00:01
好,那刚刚我们对AK有了一个初步的认识以后啊,我们来介绍一些其他的用法。好,我们看一下这个print f动作,这个print f啊,大家不陌生,在前面我们学习share的时候提到过print f,它本身在shell中就有一个内部命令,就叫print f。Print f啊,这个用法跟AWK的F基本上是一样的,那我们用print f可以来把内容输出的时候可以加一些格式化。比方说我们可以用。减号表示约定,这个字符串是以15的宽度来显示啊,加上减号表示左对齐,因为默认是右对齐啊,所以我们如果写上一个杠15,那就是给你预留15个字符这么宽啊,其中我们如果不够15个,那我们就左对齐。
01:13
啊,Print这个F的指令的显示呢,它前面是由格式定义的,就前面先写格式,后面再写你想要输出的变量或者字符,所以如果是这样写,那就意味着我们要把到一取出来,也就是第一列取出来,呃,我们认为就是个普通字符串,当然我们这没有约定他的其他格式。啊,默认情况下print f是不换行的,所以这时候呢,你会发现全部的第一列也就用户名全放在了一起了,是吧。所以我们希望换行,那就加上一个,那是不是就换行啊换行,当然我们还可以让它对齐。
02:06
他说20S,那就是我们给你20个字符这么宽。20个字符这么宽,默认是右对齐,大家看右对齐了吗?对齐了吧。当然也可以左对齐,不过左对齐就看不出来了。啊,左对齐,你看都是贴边的嘛。因为它默认不就是直接就贴边了,对吧?啊左对齐呢,就加加个减号就贴边,当然我们还可以这么干,我们这还可以显示多个字段,我们这是一个字段,那我还可以显示多个字段。啊,比方说啊,再加上一个字段。加个字段接,我们去显示数字,这个数字呢,D就是数字,我们要显示谁呢?显示Dollar。
03:04
三是吧,DO3那到三它在显示的时候,中间用什么?哎,比方说我们这呢,空格给它隔开,然后这是数字,数字的话我们直接显示要这格式,这报了一个错。看看中间少了一个什么符号?嗯,这是S反括号,这约定了它这个空格,DB是这样把它连在一块。在这儿说什么?哪出了个错?他说,诶,菲尔内姆,ETC。参数不够用,那也就是说我们这个地方,它认为这个符号分参数和对不上。对不上,那这个地方我们指定的字符,这是十进制数字是吧,十进制数字,看这十进数字是不是出了问题啊。
04:03
实际数字逗号隔开,把它这个地方逗号逗号隔开,哎,它要一一对应啊,一一对应,然后这个逗号隔开以后呢,这是数字,但是当成十进制了,而且默认是左对齐,我们也可以给它让它右对齐啊。这个你要给他一定的宽度啊,比方说我们十个十个的,它默认就是右对齐了,然后呢,你加个减号,它就是左对齐了。吃饭。这是不是有点像表格的感觉了?对吧,所以这个慢慢的就可以类似的组成一个表格形式了。当然这个形式呢,你还可以再加一些别的符号,比方说用户名啊,啊,包括他的一些提示信息,然后我这可以加一个这段代码看看效果,那这个呢,就是在显示的时候,我要显示,嗯,第一列是用户名,但是是我们前面加个user内的冒号啊。
05:10
是吧,就是那个冒号啊。好,那接着我们继续来看。在share,在awp中,它也支持各种乘除运算啊,像这些呢,我们就不用说了,大家应该都一看就能看懂啊。那你像刚才我们曾经给大家说过那个乘,实际上你还可以做别的运算,加减乘除都可以,同时还可以支持赋值也都支持啊,你像这个加加减减,相信大家应该知道什么意思啊,你看这个命令的执行,最终它是定了一个I的变量零,我们打印I加加,那打印I加加它的值是多少?
06:00
打印A加加逗号,哎,那就是我不仅把A打出来,A加加打出来,再打A,那这个结果应该是几啊。零一,那因为他先把这个A打出来了,打完了再加,所以后来的时候再打就变成了一了,啊这个变成这个样子,那当然那如果是加加,那你这个结束是多少,是不是就加完了再打就变成这个样子了。还有这个这个它这个是N等于零,N就是变量赋值嘛,然后这个是叹号N加加。这是啥意思?那这里面实际上隐藏了一个要求,就是我们接下来要说的啊。
07:05
在打印的时候啊,它这个是有一些逻辑处理的。这个逻辑处理决根据你的真假来决定怎么去打印。那我们都知道aw k的最基本的语法呢,就是aw k,它有一个模式,那这个模式呢,呃,来影响我们最终是否打印对应的行。大家看这是程序,这个程序呢,我们这需要加个T。那这个pattern模式。他是真的时候我才去执行这个命令啊,假的时候我就不执行这个命令了。好,那那么怎么判断真假,咱们这是有对应的这个模式定义的,那这个模式呢,我们看有多种方式,第一如果模式什么也不值,那就是空模式,空模式呢,就相当于所有的行都匹配,你像我们之前基本上就没有写过模式。
08:05
这个地方是空的,那就是所有都匹配,所有都匹配,那就每一行里面的第一列,第三列都打印。那还有其他的方法,就是我们可以写正则表达式,就是把正则表达式放在两个斜线中间,那就意味着只有符合正则表达式的行才去执行里面的动作,那比方说像这个。这个是不是就是打印那些以UUID开头的行啊啊打印到一就是第一列啊第一列当然我们应该知道这个文件第一列放的是不是就那个。用户,呃,那个UID那个设备名啊,设备的那个ID号你看。这是不是就挑出来,因为这个文件里面,它实际上有好多不是U开头的哈,这不就进行过滤了嘛,相当于那这就是那个pattern用正则表达式就可以过滤了啊,咱刚才实际上已经写过这种写法了啊。
09:06
那还可以来执行取反,叹号就是取反,它这个地方有一个模式的取反,就这个叹号取反。所以呢,你也可以把这个叹号呢,加在外面这个地方加个取款,那一取反,那是不是就恰恰是不是包含6ID开头行了,对不对,这不就取反了嘛,啊取反了。啊,这是第二种格式啊,政治表达式,那第三种呢,是关系表达式。关系表达式就是结果,如果为真,它才去执行啊。如果为假,那就不执行,那这个真怎么叫真呢?是这样的,结果为非零。
10:01
结果为非零,哎,那么或者非空的字符就是真,结果为空或者零的值就为甲,好,所以大家看这个命令,这个命令能告诉你具体的意思。那我们看,如果这个地方是针,啥叫针呢?就是只要有有内容它就是针,那我们刚才看到了这个地方只要是有内容就是真。结果不是非零的值或者非空字符串就是真,所以呢,比方说我们这有一个一的数字或者二的数字,只要不是零就行,大家看是不是就全打印了。因为这就代表真嘛,它只要不是零就是真啊,那也是真,但是零就是假了,那零零就是假了,假的话后面我们都知道,这后面实际上隐藏了一个打印print dollar0对吧?哎,这个就不用写。
11:03
所以零的就是甲,那甲的话就全都不打了啊,当然如果我们这中间跟的是一个字符串,比方说ABC,那ABC这是一个非空的字符串,那他就认为是真。啊,那如果是一个空串,这是不是就是假,当然如果空串,比方说它也不算是空串,它是空格,这算真还是假?哎,这算真对吧?啊,这就是他判断的逻辑,明白了吧,看判断逻辑。那就是真和假,当然也可以取反啊,取反比方说零零是假,但是我们一取反不就真了吗?一取反就真了啊,同样道理,那这个一一区反是不是就成假了,明白了吧?哎,这是它背后的这个概念啊,后的概念。
12:01
所以真假呢,他就是这么来判断的。好,这是关系表达式,那接着还有继续B选啊。啊,你像我刚才说的这个例例子,就前面这个例子,实际上说的就是类似的这种情况。好看这。这个这个是最终打印的结果是什么,看看。啊,那这个N是零,N刚开始是零,那这个加加是后加是吧?那么这个N呢,一取反,N1取反变成啥了,那N是零,一取反就是一,那一要不要打印,要打印,所以就第一行打出来了,打出来以后呢,这个N的值是不是就被加了。
13:11
啊,它不就变成一了吗?变成一以后呢,第二行的时候,它一去反一变成一取反就变成了。零零要打吗?后续就不打了,当然它又加了N就变成了二二加完了以后呢,第二第二次第二行的时候又来了,又来了以后,呃,第三行又来了,第三行一叹号一去反又什么。又变成甲了,所以是不是只有第一行打,后面就再也不打了?明白了吗?那最后就变成这个样子了啊。好,那这个呢,就是刚才这个例子啊,那你看你也可以看看这个。你把这些数字呢,可以执行一下,看看它的效果。好,这就是把这个N的值你打一下,你看看就知道了,那第四的时候N打完了是一,因为这个是先取完反应以后,它判断了为针,针完了以后N加一就变成了一了,N最终是一。
14:13
啊。然后下面这个也是类似的。看这个结果,这个结果是把这个加号写在前了,那这个加号写在前,那这是什么意思呢?它是不是要先加了,那就是N等于零,先加了再说啊,加完了再说,那加完了变成一,一区法变成零零,你说还符合要求吗?不合要求就不加了啊,上来一个都打不出来了,对不对?所以这就是他背后的逻辑啊。然后呢,我们还支持比较运算符,第二运算符,我们刚才用过这个写法。等号,等号就是比较等于,那就是NR,如果等是第二行,NR不就是那个行号嘛,如果是第二行把它打出来啊,不是第二行就不打了,那我们都知道这个文件的第二行恰恰就是那个,那就是这个K那行,那所以我们用这个方法可以把它打出来。
15:23
哎,那你可以把这个第二行跳出来打,那你像咱们的IP地址不就在第二行嘛,按照这个就可以用这种方式来,这个方式打这第二行就打就行了。啊,跳出第二行来打。当然它支持不等于是吧,那就除了第二行都打,除了第二行,所以我们要挑第二行的话,以前用set,现在也可以用a wp了。挑第二行吧,啊都可以做。当然它还支持什么大于等于之类的啊,比方说我就想显显示从第几行到第几行啊,例如我们这有十行,我就想打印其中从第三行到第六行,那应该怎么写呢?那就是NR。
16:18
大于等于三啊,我们这还可以写个and n r,然后小于等于六啊,小于等于六到NNR。因为不能写and吗?而小于等于六。小于等于九不能写。这个符号儿有问题。小于可以吗?不行,那中间可能少了一个符号。这个写法。
17:00
这个写法啊,At是这个写法,两个at不能用那个at啊,这个是表示并且啊,并且这个并且呢,在这在下面有并且看这有。并且和或者两个表示,并且两个竖线是或者啊或者。好,这是刚才啊,另外呢,我们这边还有一些很有意思的用法。啊。什么用法呢?这个这个写法。这个小。你看这个取二,这是百分号二什么意思取模,那这个取模等于零,大家想想行号取二对二,取模等于零,是不是就是偶数行,所以用它就可以轻松的取出偶数行,用这个可以轻松的取出奇数行啊,你看是不是就能达到这个目的?
18:05
是吧,这这个很简单,当然咱们也做过这事啊赛诶,你们记得赛怎么取基数行母五行吗?不是就来。一波让弧二吧,对不对,这不是这不就这个写法吗?啊,这是记数法,那偶入行那就是对不对。相信大家记得。啊,另外呢,它还可以支持模式匹配,就是我可以把波浪弧和叹号。分别表示左边的某个符号和右边相匹配。啊是默认是包含关系,所以你看这个零。波浪弧后面带个root,这什么意思,这是不是就是你这个到零里面包含有root,那就把那个包含root那一行挑出来显示。
19:13
啊,当然他打印的是一,那我们把整行都打一下,看看效果。那这里面是不是也包含啊,这就不朗,当然反之你也可以不包含,不包含就是叹号不朗啊,这些都不包含。啊,事实上咱们也不用非得用这种写法,因为我们刚才用过一种写法,就是直接写正则表达式。直接写这个表达式就可以,就用不着这样写了,直接这么写,这样就可以看到吗。直接就是包含root。当然你也可以表示以什么什么开头,那就直接,这不正的表达式吗?是吧,这是刚才我们用过的啊。
20:01
把逻辑运算,刚才讲过了这些用法。啊,另外呢,这边还有一个叫三目表达式,三目表达式说的就是由三个元素组合而成。第一个呢叫判断条件,如果为真就执行这个,如果这个条件不为真,就执行这个。就是甲就是执行这个,那你看这个命令,大家看这个命令最终的效果,能猜到什么意思吗。那你看我们是被到3DO3用冒号作为分格符,是不是用户的那个ID啊,那这个第三列如果大于千,那么我们变量的值就是command user,如果不大于三,那就是this user。那这个变量就取了不同的值了,然后呢,用print打印,打印的时候呢,我们要打印DOLLAR1和type user type这个变量啊,User type这个变量刚才不是已经根据不同的条件这个赋值嘛,然后这呢是对他们的约定,它的格式啊,是组对齐对齐之类的啊。
21:13
然后进行打选看。你看这样的话呢,这个root它的ID是小于1000的,所以就显示CU啊,但是有些呢是可能U,因为这个账号的ID是大于千的。同时我这还故意加了一个竖线,那这个竖线啊,就是冒号啊,冒号把它们隔开,看到没有,这个冒号隔开。啊。好,这是三步表达式啊。好。啊,前面这些例子都讲过了,诶这个例子还是很有意思的。看看这个能不能想象出来它是什么意思。
22:23
这个。你去哪?那这个I呢,我们用了一个估值,I等于叹号II等于叹号I,那这个地方I的值刚开始是没有没有值的,比如空值,那空值的话,呃,那现在I又等于叹号H,那就用取反了。
23:01
那一取反它是不是相当于空值,空取反是不是就变成了一了?那大家想,刚开始A的值是空,那么空取反以后就变成一,那A的值就是一,一的值是不是就真了,那值真开始打,然后A已经变成一,下一轮的时候A是一了,一取反又变成零了,但是没值了。没就是不是没值了,是零了啊,就取成反了嘛,那又变成零了,那它的值就是100101010,这么老变,那么最终就成了一个这样的结果,看见没。是不是打印基础好,看吧,技术好。好,所以这个就是咱们实现的一个效果啊,实现的效果,当然你也可以把它再取反。那如果你想打印偶数行,我们是不是整个把它取个反复就完了?
24:04
整个取个反,那不就正好反过来了,当然除了这种方法,它可以用什么方法,我给它初始值设一个A等于一不就行了吗?对,因为它刚开始I是零嘛,所以才导致打印基数,那如果有值了,是不是正好也可以了?嗯,能看明白吧,啊,这是打印读书好,所以你看咱们方法有多样。这个执行。终于理解哈。好,这就是他最后实现的逻辑啊好,那这是刚才给大家讲的,那这些例子呢,实际上就是类似的啊,我在这就不去演示了,大家可以看一下。啊,这还可以指定行的范围啊,行的范围的话呢,这个我们只能用NR这种方式来表示,因为我们他没有a wp里面表示行号的方法,所以我们就只能写成这种形式,或者呢,也可以写成模式,正能表达式就从什么地方开始到什么地方结束啊,比方说咱们就以这个文件为例,那这个文件呢,比方说我们从。
25:18
啊,随便找一个,比如说B开头的到这个F中间的这些符号进行显显示,那么就可以这么来表示,四个斜线逗号隔开脱字符B,然后脱字符F,这是不是就表示什么什么开始到什么什么结束对不对,哎,你看。可以了吧,B是不是FF啊?这就出来了,但是它有两段都是BF的啊,那从B到F,这又是不是又出了一个新的B,新的F,这两段出来了。好,那刚才我们曾经老说这个begin end,这个begin end呢,实际上是这样,Begin呢,它是在文件处理之前就要执行的啊,咱们当刚才曾经给大家说过,比如我这如果写一个print。
26:16
你会发现啊,他这你这个文件有多少行,它就会打印多少遍啊,比方说你看这个文件有三三行,它就会打印三遍,当然没打出来是因为它把它当成变量。啊,打印三遍,那如果我就想只是打一个hello,那么这加个别就好了,别begin呢,就和文件无关了,你不用加文件了。就打一次,因为他是表示文件处理前执行啊。好,那么同样道理,我们也可以来加个这个end end呢,就是整个文件处理完以后再打印件,比方说我们就打印个end。
27:07
你好。啊,所以我们可以这么认为,一个是打印前的,一个是打印后的。那比方说就叫。那么。Begin中间就是一行一行的处理文件。变成这样了?啊,你像这个。这是干嘛的呢,就是加了一个。把这个用户的UID给他做成它的标题。啊begin,然后呢,开始打印第一列,第三列就加了标题啊加了标题,那我们看看它的效果能不能看起来比较直观一些,你看这是不是又加了个表头啊,对吧,加了个表头。
28:08
啊,甚至你还可以再对齐一点,把它凑齐了也是可以的。啊,你用print f给它用左对齐右对齐的方式,这样的话最终能打出一个比较好看的界面。好,这是刚才给大家讲的这个指令。然后接着我们看一下在DP中,它同样也支持条件判断,那么条件判断呢,我们大家比较熟悉的if啊,这个if呢,它可以支持多分支啊,多分支呢,就是如果命令这个条件为真就执行它,如果为假就执行它。啊,甚至我还可以更多一些,比方说条件为真执行它,如果条件不成立,再看第二个条件是不是成立,如果条件成立就执行它,如果还不成立,那就执行它,看到吧,在这个语句呢,啊,在看这个条件是否成立,就可以多个条件判断分支。
29:09
啊,比方说你像这个语句,这个语句是不是就是判断什么呢,第列。是否是一个第三列啊,第三列是不是大于1000,大于1000,如果大于1000就打印第一列和第三列。其他的我就不打了。那这不就判断出来了吗?那当然我们下面这个还可以更为复杂一些,这是什么意思呢?如果大于1000就打印这个,除此之外的就打印这个,看到没有,这是不是就双分制了啊,双分了。你看这个条件如果成立就打印它,如果不成立就打印它。啊,你看这个地方这些都是ID不够1000的,不够1000的就打印这个东西,这些都是超过1000。
30:03
啊。是可以显示的。啊,另外呢,我们还可以作为。哎,你看你用了这种方式,我们将来是不是可以轻松的取出分区利用率大于多少的。我们现在用这个命令呢,是可以取出分区利用率,但是。哟。这取的时候啊,这是取出大于多少的,大于80,因为我们这没有大于十的,没有大于80。你得给他。那看我这个分区利率没有大于80,那我就这只有三二十三的,那我就把这个值调的小一点十,如果超过十,你看大哥。直接aw k就搞定了。当然我这用的是两个aw aw k,实际上一个aw就可以搞定啊,一个aw k怎么搞定啊,哎,你看这个就是aw k。
31:10
一个我们就搞定了。好,看一下这个指令咋写啊?那这是空格或者百分号作为分格符,然后取谁呢?取第一列和第五列,第一列就是那个设备名,第五列就是那个进去利用率,我对这个第五列进行判断,如果大于十,我就把它打出来,看见没有?这个一条命令把它搞出来了。所以有了A以后呢,我发现以以前做的事,反正比较啰嗦的,现在就可简单一点了啊。这也是一样的,这是一样的。好,来这个地方,这儿也是加了个条件判断if。
32:05
好,那你看这个语句呢,实际上就是对咱们的。Test的这个变量。啊,进行判断。它的这个变量如果是100。那接着判断它是不是大于十,90,大于90 very good,呃,不大于90,接着看它是不是大于60,如果大于60也算是good,如果不满足要求,那自然就不到60 no,有没有?马上你们就考试了是吧?说说考试知道时间了吗?啊。还没跟他们说吗?啊,就明天计划给你们考试了,嗯,明天那个明天明天不是周六吗?你看考试的话考什么,就是考我们现在讲过的所有内容,正好脚本也学完了,网络也学完了,A大今天也讲完了是吧,正好。
33:22
反正笔记你手上都有嘛,是吧,你可以从笔记上翻这个开卷考试啊,开卷考试,开卷考试,但是不能抄啊,不能抄别人的,你抄自己的,抄自己的笔记可以百度,你只要是能找到答案就行,因为你将来上了班不就是类似的吗?将来上班给你布置个任务,那你管你用什么方法,你把它搞定就行了,是吧?啊,这是刚才说的,那另外呢,这还有个Switch Switch呢,Switch呢,这个也是类似,实现了条件判断,你看它这个写法,就跟我们以前说的那个share中的case写法很写它的判断逻辑就是。
34:22
如果这个表达式的值是它或者正则表达式满足要求好,那我就执行这个语句,如果不满足呢,看下一个满足满足,如果满足就执行他,默认就执行他,这个写法跟那个case很像。就很像啊aw的配置配置。好,那么这边呢,它还支持循环,支持循环,那这个循环语句。啊,这个实际上也算是条件判断啊,这个实际上它也算是条件判断,这个条件判断好,那么这个循环我们来看一下,有where循环,还有什么do where循环,还有for循环,你看它都支持。
35:09
这些循环啊,咱们基本上在线中,你看看到的都是很像的,外循环是这样的,它有小括号,把条件写在小括号里,然后如果条件为真,将执行循环里面的命令。那么这个。条件为假就退出循环,条件为真,执行完循环这个循环体以后,接着再去判断,那比方说我们现在可以加这样的一个指令。这有一个函数叫Les,这个Les这个函数它是取这个字符串的长度,比方说我们就取这个和它的这个长度是多少,你看能取出来是五个。它这个长度呢,取的是字符数,比方说马克教育它是四个字,它就取出来四个,在这有个less函数。
36:05
啊,这是系统自带的函数啊,那么这边呢,有一个和这个函数有关的,那看一下这段代码什么意思啊,首先它这是不是有一个过滤条件,这是不是找出了以空格开头啊,后面是那个16的行,找到这个行以后呢,这里面写了一个循环语句啊,这个循环语句说的就是I初始值是一,然后whilei小于等于NFNF什么意思?NF就是记这个字段的数量。那么I小于等于NF,那就是字段的数量,比方说字段数量有十个它就行,I等于小于等于十,然后接着打印,AI的值不就是一吗?刚开始,然后打完了以后取A的长度,也就是把第一列的长度取出来。
37:04
打打完了以后加加,那加完了以后是不是就I等于二了,一直取到什么,取到所有的字段都取完,那实际上也就意味着它一个字段一个字段取,取出他们的长度来。要这个没有这个内容没有内容,看看到底是文件的格式发生量应该是七上的啊,这里面看看有没有LINUX16那一行可能没了,它不叫LINUX16了,这个应该叫Linux了,看看这里面你看没有LINUX16那行了,这个是三七上支持的啊,三六上没有了。44度八上没有四没有,那在七上执行一下。七上执行,嗯,因为这个没有那个,那没有那个行。好,那大家可以看到A16,这是第一个字段,就包含了16的这一行,它有A16啊这些,那么其中这是七个字符,这是31个字符,这四六个字符是不是一可以取它的字符。
38:12
啊,那实际上你最终你把它打一下,你看看他是什么样子,就包含LI16的这一行的样子什么样,就这个样子,它有两行包含LI16,分别统计这个有几个字符儿,这个有几个字符。这个有几个客服你知道吗。有多个字。好,所以这是我们给大家讲的这个。好,这是a wp的循环,当然既然可以支持循环,那我们完全也可以支持数字计算啊,你像我们之前曾经给大家说的那个从一加二加三加到100,现在也可以用aw搞定,它怎么加呢?看total等于零。I是1I小于等于100I加等I to等于I加等I加加,这个算法大家一看就看明白了吧,最终你看打出来了。
39:07
他也可以做。啊,这是用where循环实现,用实现。还可以用do wear do维呢,它的命令格式是这样的,他把那个循环的条件放在后面去了,他把要循环的指令放在前面去了,前面写个度。所以这时候就带来一个问题,就是因为命令都是顺序执行,所以你上来先执行这个命令,再执行条件判断,那是不是就意味着这个命令不管他,呃,这个条件真假,反正前面已经把这个命令执行过一次了。所以就。保证,用杜维尔能保证这个命令至少得执行一次,至少得执行一次。当然它也可以计算我们刚才说的100相加那个值,你看这个无非就是把这个度要循环的指令放在前面,他俩换个换个次序,要最终是一样的效果。
40:09
好,那另外呢,我们还支持for循环,For循环的写法跟C语言风格的这个she中的for循环,你看是不是一样的啊,你看第一个表达式,第二个表达式,第三个表达式循环。啊。那比方说我们也是用它来计算一下,从一加二加三加到100啊方法呢也是类似的,怎么做呢?Total是零负,你看I初始值1I小于等于十一百,然后I加加。偷偷都与爱家你看一样的。无非就是格式上换一换,单词换一换,所以逻辑上没什么区别。啊,非常容易理解。啊,这个刚才那个for where循环也可以写成for循环,一样的一样的。
41:02
那这边呢,有一个性能比较,所以我们现在目前来讲呢,发现呃,For循环呀,呃V2循环呀,咱们在EP里面,包括以前share里面都可以支持,那都支持到底谁速度快呢。那咱们这有个比较,比方说我们计算稍微多一点,因为100太少,算不出来,比不出来,那比方说我们加上10万个数字,从一加到10万,加到10万,这个是不是就能比出速速度来了,那当然这个用C来写一下吧,C2的话呢,我们要从一加到10万,应该怎么写?啊,比方说我们用C语言风格的那个for循环写吧,C语言风格的for循环怎么写来着。For,这个for循环它不有两种格式吗?那这个是第一种格式,第二这是第二种格式啊,我们用C语言风格的,我们用这个写好,那比方说我们I,呃是等于一开始啊,然后A小于等于10万是吧,A加加do let,然后S,比如说我们前面初始化S给它一个初始值,S初始值是零。
42:42
甲等A度,然后然后再把这个三打一下,对吧,这样的话是不是就出来了,但是这个出来以后呢,它这个速度。我们只能人体去感觉啊,所以我们把它这个怎么就比较出来速度呢,那我们前面加一个T命令,但碳命令呢,你把它这。
43:12
括起来作为一个整体,作为一个整体,把它作为一个整体命令执行。那这样的话呢,比出他的时间来,大家看他大概花了0.748秒啊呃,总体上花了0.74,其中用户空间和内核空间分别花了多长时间。好,这是用。Share来实现的。那么我们刚才用到aw k里面的。那AP里面我们看一下将花多长时间,我们也是计算同样的数据量10万,看看他会花多久呢。你觉得会花多久?
44:03
基本上是多少分之一啊,1/70是不是aw k快的很啊啊,当然我们好像做这个计算除了用循环,好像我们以前不用循环也能搞定,用什么来着,咱们以前不是说过这个S加是吧,100哎,这不就出来了,那我们就无非就把它变成10万BC,这个你觉得它速度怎么样,仍然比不上一大。
45:04
到底有没有三个人研发出来的东西,嗯,三个人合作研发的是吧大啊,所以这就是他最终的一个比较效能啊,所以相信大家现在就比出来了啊,另外呢,咱们在awp中也支持循环的提前结束。你像continue break,咱们在线中就学过吗?它的效果跟awp中一模一样。Continue是中断本次循环,而break是中断全部的循环,那你看这个例子,这个例子大家看看它最终的效果,光看指令能不能猜到它的效果。你看上是零。I是从一循环到100 I对二曲模,Continue啥意思?
46:03
就是结束了本次循环,那如果不是等于零,那就上加,哎,啥意思,就是偶数的时候,它就不执行那个加了,只有奇数加,那是不是就奇数相加之和,就是把基数给加起来了啊。那肯定。当然,这个continue如果变成那啥意思?第一个数字不符合要求是吧,所以他就会加,但是第二个数字就符合要求了,就break了,那是不是就最终就成了一个数字了,对不对,因为整个循环结束了。对吧,整个循环结束,那如果说我们拿一个50。
47:00
50。那这个是达到50的时候才break。那是不是就是加到50就结束了。只加到了49是吧,从一加二加三加到49 50就不加了,就退出了。啊,就是和。好,那接着我们看next,这个next呢,是我们别的命令里面没有的。他表示的是提前结束本行的处理。我们都知道,Awp默认它就相当于自身就带有了行的循环,因为它处理一行才读下一行,读完下一行,在这处理下一行,下一行。这个东西我们可以用next来把这行就给他提前结束了,那我在处理这行的时候,直接练的话,就直接跳过这行,就接下一行,所以呢,大家看如果是这段代码,你看看这什么意思。
48:10
这个能看懂什么意思吗?得塔三对二取模,德塔三不就是UID吗?对二取模,那不就是偶数或者奇数,它说不,不等于零,那不等于零,那不就是奇数吗?奇数的话就N了,N是不是就跳过了,那是不是就是奇数就跳过,那是不是只是一个偶数啊?所以它就会只把那个UID为偶数的内容打出来,明白没有,全是偶数,奇数就不要了。The next。啊,这是这样的一个概念啊。好,那么在aw中也支持强大的数组。
49:06
数组这个地方还是很有用的啊,很有用,AWK,它的数组就是关联数组。关联,还记得关联数组吗?关联数组不就是它的下标是任意格式吗?啊,不是那个01234那种,而是自定义格式,那关联数组在aw中它可以。对,变量过程,过程数组的元素一个一个赋值,这个赋值方法跟我们前面讲的是一模一样的,大家看是不是一模一样的,在线中不也是这样赋值吗?你看这就是这样,过去复完制以后要打印的话呢,直接把这个数组名打上跟上就行,数组加下标就完了啊,你看这个呢,就是对。其中一个数组多个不同的元素进行赋值,比方说我们这有一个V的数组名mom q啊,Third这三个数组元素赋值,现在最终我要挑出慢来把它打出来。那么。
50:13
好,那现在看这个命令,这个命令最终能实现什么效果呢?那我们这样,我们把它生成一个新文件叫test,这里面呢,有一些行。哎,那这这里面我挑一下啊。那我这个文件里面有些内容。好,然后接着我们后面跟上这个文件,大家能想象出来它最终的效果是什么。这个比较绕啊,仔细看这实际上就是数组,你看从哪能看出数组中号啊,但是它的数组的下标比较奇怪。
51:03
他的数组下标是拿啥当下标的?他拿DOLLAR0当下表。DOLLAR0当下标不就是那个整行吗?那是不是就是把整行都当下标了,把A当下标了,把BB当下标了,当下标没问题,它这还加,还要取反,那我们都知道,比方说把第一行读进来的时候,它是不是就变成这个样子了?是吧?但是这个下标是A的数组元素,它有值吗?它的值是多少啊?空吗?因为你没赋值吗?没赋值。那没副值,然后一叹号取反变成啥了,针针,那是不是要这一行要打印打印那就把A这个打出来了,然后加加加加,那是不是意味着原来是空一加加变成一了。
52:15
这不就值了吗啊?然后接着。B也是这样,B也会打印,C也会打印,那么最终呢,我们前三行打完了以后变成这个样子也是一对吧?CC是不是也是一好,那接着第四行的时候又出现A了,但是A的时候已经是一了,一如果一叹号取反零,那就是甲甲还打吗?不打,但是呢,加加接着加,接着加,加完了又变成什么二了,当然你下次再看到A的时候,如果还有A的话,它是不是还是一区反又是假的啊?啥意思?知道了吗?那这是去虫的效果。
53:03
就用这个一个小脚本小命令啊,比方说你看如果再出现A,你再出多少个A,它也只打印一次。那也指一下面。就实现了去重的功能。是吧,去除。你看这个用到了有意思的数组的。这种用法。那数组呢,它。在aw中,数组有一个不太。不太容易解决的问题就是数组它的下标是没有规则的,因为它可以任意格式啊,不像我们aw在share中的普通数组那1234排号,0124排号,那么我们是不是可以遍历从零开始循环,123就慢慢就可以找出来。
54:04
但是aw k的数组元素,它的下标是自定义格式,那自定义格式你咋知道到底有哪些数组元素呢?那这边呢,它也可以判断,这边有一个判断的方法,就是硬后面跟数组的名称。比方说我这有个数组,它的数组名,然后后面跟个I,并且给它赋值勾,给它赋值,然后我想判断这个I这个数组元素。对应的下标它有没有,那你就可以用这个写法就行了,这叫数组下标,应后面跟上数组名。如果存在就是一,不存在就是零,就是判断它存在与否啊,存在与否,当然我们还可以加,因为一和零的话,一般人看的不是特别清晰,所以我们可以加一个条件判断,把它转换成比较容易看懂的,那么怎么看呢?就这个。
55:11
这个很。这个呢,我们这样看的话,就看起来比较清晰了。干。他这是不是判断,如果这个I存在,就打印存在,如果I是返回的是零,不存在,它就打印不存在。啊,这样的话就可以了啊,I是存在的,因为我们这有这个下表是吧,那当然。如果我这写一个不存在的,比方说ABC,它是不是没有这个下标。就不存在啊。那另外还有一个我们需要解决的问题就是遍历,因为数组它是用关联数组,关联数组的下标是没有什么标准格式的,所以我们怎么知道一个数组中所有的元素,它们分别用的是哪个下标呢?这个就比较困难了,如果是普通数组,AB1234能变例就行了,但问题是它没没有格式应定义,所以我们这有一个叫for,后面跟上一个变量,再跟上一个应一日照抄固定单词,这个就是数组名。
56:22
那么将来用这个语法,它就可以不断的从这个数组中取出它的元素,那么元素的值就是元素的下标会放到哪去呢?会放到这个Y变量里,也就是Y的变量将来存的就是数组的下标。那由此就可以便利出我们数组的一个一个的元素。比方说我们这。来看这个指令,这个指令也是,这是一个数组的下标赋值,数组的下标赋值,哎,接着我要找到所有的数组元素,怎么找呢?循环IDA后面数组零,这个I呢,是个变量,那么I的值将从DA里面的元素中取它的下标。
57:10
哎,那你看I这就可以,I就是它的下标,当然你这儿可以把A打一下,把I打一下看到没有。哎,打一下你看A的值不就是里面的下标吗?值,哎,I的值就是它的下标。啊,这个也是一样的,就是不是放的是学生而已啊。那这个是咱们你们41期的表哥的名字啊,什么戴总啊,军总啊,坤总啊,反正都是假的啊,你们也都是总啊,好好学习都是总。那这个是最终实现的是什么效果呢?就是第一个一号学生带走二号学生军总,第三号学生是坤总,那我想把所有的学生都找一遍,那我们就用这种方法。
58:12
用循环遍历student这个数组,打印XX就是它那个数组的下标,然后用冒号隔开,取它的数组的这个下标对应的值取啊。这就是这个取值啊,我替一下吧。好。那这些例子都是类似的啊。类似的。哎,这里面有一个非常。也是很有意思的东西,就是看看这个。咱们再次取主机的连接状态。主机的连接状态,刚才我曾经连过我那个服务器啊,我现在看看在不在了,不是这个。
59:06
嗯。谢。好在这呢,我们刚才曾经有一个文件叫ss log,这是当时把那个链接里啊,传到这个文件里去了啊,我给他传出来吧,传到这边儿来。然后我再导到我这里面来用。好,大家看,这个就是我们生成的SS命令的执行结果,现在我们还是想把远程主机的地址给它拿出来,统计他们每个主机的连接次数。
60:01
之前的连接统计方法呢,我们传统的是用这个什么啊,这个写法啊,这是NR不是一的情况下啊,把它取出来这么统计。啊,这个是它的连接次数啊,这是连接状态出现的次数,和这个还不一样,连接次数出来的不一样,这这样连接次数,我这个是统计他的IP,这个不一样啊,不一样。不一样也无所谓啊,不一样也无所谓,那就拿这个也行,那这个怎么统计这个IP出现了多少次呢。那。咱们先把这个IP先拿出来,IP刚才我们已经知道怎么弄了,刚才方法是什么来着。啊,我们先NNR不是第一行是吧?啊,就是从第二行开始嘛,啊,然后去。
61:01
我们先先把它取出来再说,你看这时候把那个不是第一行就过滤掉了。啊,关掉之后我们要把这个地址取出来,刚才还记得怎么取吗?那我们是用什么做的分格符来着,空格然后冒号取取谁来着,减二吧。这不学上了吗?哎,那现在我们不是这么干了,我们是把这个IP地址存到一个。夏冰。存到一个下标IP的下标里,IP是一个数组名。
62:06
那将来我们这么一放成了什么了,就是IP中间就放IP了,就比方说三。这个。发了一个这样的地址进去啊啊,那我们说了这个,这是个当下标用了。那么下标用了没有用啊,那我们要统计它各自出现了多少次,怎么办呢?加角。那这样的话呢,是不是同一个IP的这个地址出现的次数,是不是就不断的往这个同一个IP地址作为下标的值里面元素里面不断的赋值,不断不断的赋值相加,然后接着我们整个做完以后再来一个破循环。倒循环干什么呢?就是我们要遍历这个数组,变了个数组干嘛呢?就是统计它的数组,比方说IP是ii,就是它的下标,那出现的次数是多少?出现的次数不就是I的这个元素的值吗?
63:11
啊,这样的话就出来了,看到没。那是100这个机器出现了一次,其他呢,出现了86次。你看到这个写法了吗?这个写法。很有意思啊。经过了。当然,同样道理,咱们也可以统计我的连接状态。啊,你像我这个网站,它的连接状态,我也可以去再再连一下。好,连上去了,连上去以后呢,我们看一下它的连接状态,把这个人少啊,你们赶紧配合一下啊,哎,这有了,你看这个次,不过还不够多,你们多连连,我们想统计一下什么呢?就是这个主机的连接状态出现了多少种,比方说listen呢,有几个有几个有几个,我们想统计这个对吧?啊,诶,你看这个多了,这这个多了,那多了,然后把它存到一个文件里吧,比方说叫state log,这样的话,这个文件我看看有多少行,哎,看统计200多行,那说明。
64:41
有200个不同的状态,那现在我就想刚才说了要统计摊位有几个,台有几个,这个怎么统计啊,那现在显而易见,这个统计呢,我们第一行肯定不参与了,第一行这个是个标题,对吧?所以我们怎么做呢?是不是也是刚才那些一样的写法啊,怎么做呀,就是aw k先把那个第一行先给它过滤掉,而NR是不等于一,当然你也可以是大于等于二,大于等于一不也行,大于等于二不也行吗?是吧?嗯,啊。
65:16
然后如果是在这种情况下,我们就取它的第一列,第一列,因为它这个本身就是IP,不就是那个状态值不就在一列吗?这不就取出来了,你看没取出来以后呢,我当然我们不是拿它,我是把它作为下标,听懂了吧,把它作为下标,把这个状态值当成下标统计它的状态,放到一个state数组里,那同一个数组的同一个下标的话,不断追加,不断追加,加完了以后在end for。然后接着我们在这去做遍历,遍历谁呢?就是state这个数组,便利啥呢?便历它的I的状态和state这个数组元素对应的真正的值啊出来了。
66:10
看到吗?啊,Listen出现了几次几次,各有几次出来,这是面试题啊。那这种面试题很多。当然这种面试题咱们现在用的是aw k实现的,你用别的实现也行,不过这种写法是不是感觉比较高高大上一点?那事实上刚才我们统计这个这个呃,NGX的访问日志不也可以同样用相同的方法吗?这个IP地址的前面吗?我想统计每个IP访问了多少次,是不是一模一样的,那无非就是换,还是这个东西基本上跟这个差不多,拿过来稍微改不改不就行啊,把它欠过来,欠过来以后呢,这个地方是到这一不就就差了嘛,实际上这个现在你都不用了,你就这样就可以了,直接就选了。
67:14
看到没直接取它,你看每个IP连着多少次,这都有统计。就是没有排序而已嘛,你要排个序那不也简单吗?那比方说我们把I放在后面。前面是它那个次数,然后我们再做一个数字排序,然后取它的前三个,比方说。又去了。对不对,一模一样的。这这是套路啊,是不是套路啊这个。不难吗?晕了吧,是吧,晕了哎,这就晕了,这就开始晕了,这个例子啊,看这例子都都有,都是用一样的方法。
68:10
这有多位数组,多位数组,你们下来看看啊,了解一下这个用的不多,用的不多。好,那么在awp中呢,嗯,还有函数。这个函数呢,分成内置函数和自定义函数。自定义函数。就是我们自己可以定义系统自带的一些函数,比方说我们刚才用过一个length长度,那个实际上还有一些截的函数,比方说这个RA呢,是返回随机值SRA呢是配合RA来生成随机数的。那这里面呢,光转是无法返回真正的随机数的啊。你看,如果我直接执行这个run的函数。
69:03
啊,这个函数呢,如果你不配合X,它反驳的是一个固定值,你看。那就起不到效果了,要加上一个SRA,它才能真正的起到随机数。当然它生成的随机数是小数,所以我们可以考虑呢,给它变大一些。那怎么做呢?就是我们可以让他添加100乘100,然后呢再取它的整,这样就可以了啊,你像这个就是用aw k就是循环循环十次,循环十次生成十个随机数字。啊,而且都是取过整的,你看它这实际上是用了三个函数啊,第一个是SRA的生成种子,第二个函数是取随机数,乘上100之后再取整,知道吧,取整和小数就不要了。
70:10
去这。好,这是咱们给大家讲的这个函数,还有一些是字符串处理的函数,比方说取长度,这个我们应该看过了,Stop呢,就是切片的,就是用来实现这个,这个将某一个T字母串去搜索R,找到以后将第一个匹配的给它替换了,替换了。啊,那这个计算呢,它不是替代,第一个是所有都替代,就全局替代,全局都替代,你看这个例子。这个例子你可以看一下什么意思。啊,他这个意思就是说我们要对DOLLAR1这个位置,DOLLAR1是谁啊,是不是就是它因为空格作为空空格符嘛,那么到一这个东西去处理,处理啥呢?看看它里面有没有冒号,如果有冒号就用横线把它替了,但是只替代第一个,但所以是不是第一个就只只有它看到没有,当然我们还有GSGS呢,就是全局替代。
71:15
是不是有两个冒号都替代了,替代。啊。还有一个叫split啊,Split这个了解一下它是啊比较绕,这个呢,就是以R作为分割符切割字符串,把这个S给它切了,切成多段以后呢,第一个段放到这个数组元素的第一个下标为一的元素值里面,切出来,第二段放在以这个数组下标为二的数组元素里面。啊,所以这个比较绕,这边有一个小例子啊,大家可以看一下。好,这个ne star的这个命令是比较旧的命令,我们建议用SS代替了,你看它的命令的执行结果是这样的,呃,这边他执行的时候有一个叫。
72:12
用TCP作为过滤,那是不是就找到了这些行,那这个地方是到了五,到五是谁呀?123455的话,是不是就是外来主机的地址和端口号,然后呢,第五列,第五列就是这串了呗,然后接着它用冒号作为分格符切割,那你看把这第五列切成两段了,切两段以后呢,IP放在数据元素的IP里面,IP当然一的那就存这个IP,二的就存在这个顿号。然后你看IP1加加,那么IP加加不就是把同一个IP加起来吗?加起来以后再去用之前讲的那种方法,那就可以统计出哪个IP连接了多少次,实际上是一样的。啊,不过它这个地方更绕,绕在哪呢?他用到了两个函数,一个是Li IP这个函数,啊,这用到了这个数组,IP这个数组,另外用到了咱们自己定义的一个抗的数呢,俩数组,所以估计同学们看这个就晕了。
73:13
啊,晕了就晕了啊晕了你就可以当不看了,那这个确实两个数组嵌套,嵌套这个呢,你要不理解就先放一放啊,这个东西无所谓。啊,还有就是自定义函数,自定义函数你自己可以创建函数,创建函数呢,你看它的单词function关键字,函数名,再加上参数,这就是函数体,最终呢,返回一个结果,那这边你看有个例子,这写了一个函数文件,这个文件呢,Function开头max X y。这是三步表达式,三表达式干嘛呢?就是判断Y谁大,如果X大,Y就等于X,如果X不小,不大于Y,那么Y就等于Y了,最终把Y返回,所以大家应该明白Y存的是什么,是不是两者之间的最大值,对吧?然后呢,把这个函数定义完以后呢,你要调用函数,调用函数那我就可以直接max后面跟上两个值就行了,这两个值从哪来呢?我可以提前这个负值,A等于30 B等于20,而A和B存了30和20,而A和B最终就表现为XY。
74:27
那所以最终就取出它的相对来讲两个的最大值是吧。啊,当然这个是一个自己属于aw k的一个呃,函数文件,所以我们用杠F调用它就好了,然后还有aw k的脚本,就是说你我可以写成一个aw脚本,下次直接调用aw脚本,这脚本调用呢,我们刚才实际上用过这种写法了,事实上咱们还可以单独就写一个aw k的,这叫释放机制,看到没?直接就写这a wp,这就是a wp的文件啊,而且我可以当权限,当这个加入执行权限给它执行了啊,你看我们这把它加上,加上以后你看它能能执行,那我们就要test的aw k啊,你看我这加上,注意释放机制是这样的,Aw k-F,然后这个呢,是个aw脚本啊,不过呢,这个aw脚本接好以后,它没有写文限啊,所以我们这需要通过家庭行权限。
75:31
然后呢,光这个文件本身是不能独立执行的,因为他要后面跟上,你要处理谁,他这判断是DOLLAR3大于1000 dollar1到三,那这是不是就典型的就是处理我们那个这个文件就行了,但是他没有指定分隔符。是吧,我们是不是还得加上分格符,你看这个求,那你想这时候awc就是个命令了,相当于是不是是个脚本了,对不对,是不是脚本。
76:01
那AP中呢,也支持传一些变量,这变量刚才我们用过那个变量赋值变量赋值,不过呢,变量赋值我们刚才一直加的是V,实际上你不加V的话也可以变量赋值,你不加V变量赋值变量赋值这也可以的,不过呢,两者之间还是有一些区别的啊啊,如果你不加V在begin中是不能用的啊,如果你加上V的话,那么就可以在begin中也可以用了,所以这个这是它的一个区别啊,这样的一个区别,你看这边代码这边也加了一个三是否小于命或者呃大于M,或者是小于等于max嘛。那这个什么意思呢?就是max不值,那就是取100~200之间的用户信息啊用户信息。啊,非常简单。那这也是个awp的一个写的脚本,这个脚本也是aw k来实现的,那你看这定义了一个变量,这个变量呢,它计算出一个值,定义的是一个时间格式,这个时间格式是这样的啊,它这按照年月日十分秒来定义这个c time呢就是当前时间。
77:16
哎,减3660,减3660这是什么意思?3660是不是就是当前那个。60乘六十三百三千六是吧,三千六是不是多了一个零啊。哎,这样的话,我们就可以取出一个小时以前的时间点,这个N呢减60。那减60结束,减60结束这个是什么?呃,这个是也是注意他这个是十分十分。那这个时间你看就是年月时,年月日,然后是这个是时和分,那时和分,那就是只是取出它的这个分钟来,分钟来。
78:12
分钟,然后呢,第一个小时的时间并不是画格式,然后这个是结束,结束减了个60,减了个60以后呢,两个值就都有了,然后你可以进行显示,那比方说我们这儿可以取出它的值来定义这个时间段的日志,你可以把这个时间段给它定义出来,从这个时间点到这个时间点之间的给它取出来。好,然后接着继续。End,然后这个是取它的数字不断的相加,当然这个和日志有关啊,这个是它是存在一个日志文件里了,然后取他的第第12列,然后这个12列呢,恰恰就是IP存放的位置,然后不断的取,最终最终得到一个结果,最终得到一个结果以后做循环,循环以后呢,看它的值是不是大于三,如果大于三就把它的值拿出来,拿出来以后呢,可以调用这个可以把它打印出来啊,这个命令我们没学,就是我们说扔到防火墙里拒绝。
79:15
啊,最终得到的结果呢,是他这个文件比较特殊,这个文件它不是一般的格式啊,它是一个接算格式,接算格式咱们后面会给大家介绍到啊,你看它的格式就是这前面是年月日,然后呢,中间主机呀,这IP存到这和这个格式,这个格式你们将来会学杰森啊,杰森尤其加这个这个Python里面处理杰森还是比较方便的。那用这段代码就可以取出一定时间之内他访问的这个内容了,这个应该是带秒的啊,这个代码this time this time,可以打一下c time,看看它的显示格式是什么样啊,我们用a wp打一下,然后我们这儿用begin,因为我们涉不涉及到文件处理。
80:14
啊,就是以秒为单位。这是计,计算以秒为单位啊,秒为单位。好,那减去六就是一分钟前啊,这是一个小时前。减去了这个值。好。那下面这些呢,你们都可以自己试一试啊,这都当作业就好了,你看这个我们刚才做过了面试题啊,还有这些这这这些内容,有的我给你答案了,给你答案了,这答案了,接下来大家可以试试,尤其刚才讲的这个题目,我觉得大家还是要消化消化的,哪个呢,就是取它那个连接状态,包括它的那个IP出现的次数,你看这些呢,建议大家都自己试一试,看能不能写出来,这段代码还是比较面试常用的,常问的,你看连接出行的次数,这个就用到了我们前面用过的写法,今天包括aw k的循环写法。
81:24
数组这个很哎,很常见,面试可以说是经常出现的题目,把这个题目好好看一看,好看看好了,那么aw k呢,我们就给大家介绍完了啊,Aw k呢,呃,它的背后的逻辑跟我们前面讲的share差不多,只不过它有自己的语法,所以下来慢慢多试试就好了,尤其这个地方的循环,它有自己的特点,还是比较好,很好用。好,那关于这个文本处理的三剑客咱们就介绍完了,终于这章就结束了啊,那咱们稍微休息一会,待会看下一个例,待会20,呃,十十五吧,15的。
我来说两句