00:00
好了,那咱们开始学习新的内容,咱们前面呢已经给大家介绍了很多文本处理工具,其中我们提到了文本三剑客。第一个剑客break,第二个剑客是sed对吧,还缺一个,那我们今天呢,就把最后一个剑客啊隆重的给大家来介绍一下,最后这个剑客呢,是aw k aw k这个工具啊,之所以放在现在才给大家介绍,原因就是因为它里面的功能比较丰富。基本上包含了里面各种编程里面的用到的技术。
01:03
12中我们前面在脚本进阶那部分呢,我们学了,嗯,函数数组在aw k中也都支持。它也支持条件判断循环。啊,所以我们前面学了脚本进阶之后,那些概念明白了,再学一大你就轻松了,无非就是换一个格式写aw KA,之所以功能强大,也是因为aw KA这三个字母本身就是来自于三个研发者他们的姓名分别这是这三个人的首字母。啊,当然大家都知道Linux才是由LINUX1个人开发出来的,A upp3人开发,你说他功能能不能能做的了吗?啊,所以可以说aw k是排在三剑客之首是吧。
02:07
所以。这个最重要的工具,咱们最后给大家介绍。Aw k呢,它可以实现格式化的文本输出。啊,我们要成为报告生成器。它可以打印出一些比较好看的格式。在aw中。官方。这提到了是模式扫描和处理语言,大家看它叫语言啊。所以aw k可见它也是一个比较复杂的应用。它都成为一门语言了,Aw k呢,历史上很早就有了。最早是从最早的unix系统上的aw k。
03:01
后来有人开发出了升级版的aw,比方说叫new aw。在他基础上做扩展增强,那我们目前在Linux里面用的这个awp呢,叫GWK,实际上就是金优项目里面的awp。虽然我敲命令敲aw KA,但实际上aw KA并不是真正的原始的aw k,好,我们可以看一下,你看这个aw k它实际上是什么?它实际上是GWP的软连接,对吧,连接。那下面呢,我们来说一说WP他能做什么事情啊?A wp呢,主要是对文本进行格式化输出,在里面呢,可以做一些更为复杂的逻辑处理啊,加减乘除啊,条件判断呀,循环呀。
04:07
都可以的。Aw k的基本格式是这个格式,这是aw k的基本格式,A aw k加选项再加它。自己的程序aw,他自己还支持自己的程序语言。它支持变量赋值。然后后面可以跟文件。它可以支持把程序的这段代码放在一个文件里面,通过杠F调用也可以。对于aw k来讲,最核心的东西呢,就在这。就是这个语言怎么写。这个program这段程序代码通常是放在单引号里面的。此外,它里面有。
05:03
三种不同的格式组成这个program,有可能有,有可能有end,不过呢,这个不是强制的。定语句和and语句可以有也可以没有。Begin和end这两个语句是用来处理文件的,钱和处理文件之后执行的操作就放在begin和end里。而。处理文件这个内容过程中。需要怎么处理文件内容,这个是由中间这段代码。来实现的,那所以这个begin end加中间那个代码联合起来,就是在处理文件内容之前先执行begin。接着就把这个文件的内容一行一行读入系统。进行逐行处理。
06:01
从这个逻辑来讲呢,跟side grape差不多,Grave side不也是一行一行处理吗?那在处理的时候,你这可要写上它的逻辑的处理语句块。处理完毕以后再执行end语句。当然,我们说begin和end可以没有,不是强制的。那他的执行逻辑呢,就是这个图。如果有begin,先执行begin,然后主行处理,大家看读一行处理一行,多行处理一行,直到所有的行都处理完再执行。And,再执行end。中间就是不断循环的过程。那么在处理的时候比较常用的选项。这个F。选项AWK。F选项和杠V选项,杠V选项实际上是变量赋值。
07:01
F选项表示分隔符。这个选项很相似于我们前面在学习。Cut cut就是cut那个命令,大家记得cut命令是不是可以用杠D来指定列和列的分割符?还记得吗?那么这个F就是干这个活的。F指定用什么分隔符来区分不同的列?Aw k把一行读进去,我们要按照一列一列来着列处理,所以我们要用杠F指定列的分隔符。不过呢,Aw k有一个非常好的特性,就是默认的分格符。他是空白符。而且允许多个空白的,连续的多个空白,他都认为是一个。所以有了这个杠F以后,咱们在以前在处理列,那就有了可非常方便的方式了,因为它可以把连续的多个空白符认为是一个。
08:13
那么在处理的时候,如何来处理文件的一行一行,那么就由这个。程序。来处理这个程序,如果有begin,先执行begin begin,然后接着就人员处理一行一行,那么在处理一行一行的时候呢,它的程序的格式是这个格式就是pattern加花括号。然后再跟上具体的动作,Action。那这个呢,实际上呢,哎,包括begin。啊,如果这个地方写成begin,那就表示文件还没有读入之前需要执行。那什么时候用呢?比方说经常我们用来打印表头。
09:04
我们都知道一个表格是不是最上面有一个表头,那这个表头和数据是没有关系的。数据从文件来,那我没有读取数据之前,先打一个表头可以用,接着就可以把文件的一行行读入,读入以后呢,这个地方可以加一些约束条件,比方说正则表达式等等。把符合条件的行进行过滤。那不符合。条件的行,那咱们就不做处理了,如果符合这个pattern定义的条件,那我就执行里面的动作。那这个动作比较常见的就是打印,要把那个行给他打出来。然后把一行一行处理完以后,这边pattern最终可以写个end。如果这个地方写个end的话,就表示。
10:00
所有的文件都处理完了,然后最后我想再来个结束语。这个结束什么时候用呢?比方说前面有表头,中间是数据底下最后我们是不是有可能会做一些汇总。比方说统计一下总和。这个总和是不是它是来自于数据的,最终做一个汇总,就在end里面写就行了。啊,所以begin是负责表打表头,End负责总结,中间就是写那些取数据,就是他们之间的一个逻辑关系啊。那这个action呢,就是动作,我们刚才提到了,它最主要的就是这个打印,打印呢分成传统的print的打印,这个print打印就跟咱们之前学的那个Linux里的A一样,就是输出一下就完了啊,它还支持更加丰富的打印,Print f print f的用法跟咱们Linux里的print f基本上一样。
11:03
就是可以格式化,可以显得更漂亮啊,什么对齐,左对齐,右对齐,它都支持。啊,大体上呢,我们对ARP有一个初步的改进认识了,那这里面描述了它的执行过程,刚才我已经说过了。那接下来咱们来看一下a wp里面的分割符。刚才提到了,我们把一行读进去以后,那它怎么去处理这一行一行的数据呢?它是可以由杠大F选项来切割成多个字段,多个列。那这个列切出来以后呢,我们可以叫域,可以叫字段,也可以叫啊这个。列都可以啊,就这个称呼都是无所谓的,然后字段呀,列呀域呀,反正都行,属性反正都行。那怎么表示切出来第一列,第二列、第三列呢?那么在aw中,它的命名方式又用到了我们熟悉的字样DOLLAR1 dollar2 dollar3,但是大家别混了啊,这个地方的DOLLAR1可不是我们那个位置参数。
12:11
啊,不过呢,和位置参数有点像,它表示的是读进去的这一行的第一列。但是你既然要第一列第二列第三列,你肯定得指定分隔符,对吧,所以我们刚才不是讲了一个杠F嘛,这个大F就是用来表示你用啥做分隔符,那我们将来取出来第一列第二列第三列啊。还有一个是零。那表示所有就是说白了就是这一行全都包括了。那。好,这是它带有的,这相当于是个系统自带的一个变量,到了一到2.23。那么没没默认情况下,一个文件的一行就是一条记录。啊,这个action动作可以不写,如果我们发括号没有写,就这个花括号不写的话,你光写了一个条件,那默认就相当于执行了这个动作。
13:07
到哪去?那是不是就是相当于把整行,因为多少人不就是所有域,也就意味着所有的这一行嘛。那就是把这方都打出来啊,这个意思。啊,当然还有其他的用法,咱们稍后再说,Aw里面它你看它还支持以下的这些写法,这些写法看起来都面熟啊。是不是条件判断是不是循环,是不是循环的提前结束,对不对啊,它支持数组。所以aw就是个小的编程语言。好,那print打印呢,就是这个一个一个的打印就好了。那这里面需要注意的就是在A大中字符串别忘了加双引号引起来。
14:04
双引号要引起来。数字和变量是不需要的。比方说有一个ABC。如果ABC就是个普通字符串,一定要用双引号,否则它会把ABC当成变量。听懂了吗?啊,当然你要写123那行,123就是个数字,不加引号就可以。那一。他的执行。我们可以看一下。这个直接写了一个aw k,后面跟了一个单引号花括号括起来。我直接写个point。那就是打印。那打啥你自己写呗。当然,我们这样写,看看效果是什么。那正常情况下,Awp在执行的时候,它后面要跟文件的。
15:01
这个实际上他这个。AC的说明啊。并不是特别严谨。你看这个文件名,这个文件名他也没有加中括号,没有加中括号,理论上这个文件名是必须写的,一般中括号表示可选嘛,但是实际上我们这个文件名是可以不加的,你看我这不加他也没报错。那他等着呢,等着干嘛呀,等着我输文件名呢,不对。等着输文件名,那文件名应该这这就写上的。是吧,不是等着你输入文件名,是等着你输入标准输入。标准输入的不是文件名,说啥随便写。随便写。啥意思?还有三种条件是的。
16:01
那我们这么写。这个写法实际上我用的是。前面看到的这个写法就是我们没有写这个pattern对不对,是不是就光写个括号print。那这个pattern没写,那你猜测pattern是用来指定符合什么样的条件的行,我才进行过滤,进行执行,那拍什么没写,没写是不是就相当于不写任何条件。那就任任何行都满足要求吗?那任何行,那就是我们读一行就打印它,读一行就打印它,那是所以就我就随便写了,所以我随便写一行,它是不是都打印这个东西。那实际上也就意味着他从标准输入读取了任何内容,他都会触发hello aw的打印。对不对。那所以大家现在就明白了,1WK。
17:01
看来是支持标准输入的。那既然支持标准输入,那我们是不是就可以随便找个文件,这个文件有三行,我是不是用awp就可以传给他,因为它支持标准输入吗?那支持标准输入不可以支持标准输入重定向吗?那你觉得他结果是啥啊,是不是就三方一克,那当然我们现在呢,实际上这个打印的结果和数据内容没有关系了啊,你有几行我就打几行,关你内容没关系,是不是这道理啊,那所以呢,比方说我这写个SEQ10,那这是不是也有打印十遍啊,打印十遍这个这个aw。还少写了。打视频。那所以那现在明白了,那aw k它可以支持标准输入重定向,就可以把一些命令的输出用aw k进行处理了。
18:07
当然,我们单单打印固定的字符串意义不大。啊,我们还可以干什么呢?我们还可以做数字运算。啊,比方说二乘三。看到没?直接数字运算。这怎么老来邮件呀?是不是因为我有计划任务?那这个邮件啥呀啊。下面那个计划任务。哎,你这应该是执行了,上午的时候不是咱们电脑给重启了吗?啊,那你看看这个计划任务现在应该是执行了,对吧,你看看这个,你看这个命令成功没成功啊,看看有没有计划有没有看成功了吗?说明计划任务是不是执行了啊,你看这就是把pad变改了的,它是不是就找到root了对不对,哎。当然工作中的话,有可能你会有多个计划任务,比方说你创建一个什么检查磁盘空间的计划任务,那么无非就是pro-一啊,你在这写,比方说我们每十分钟检查一次。
19:11
那没身份证的人还怎么写啊?斜杠十对吧?啊,当然如果我们是这么写,比方说嗯。每隔两个小时。的。十分钟检查一次,那这时候我们这写个心写个二,那这是什么意思啊,那就是每隔两个小时的第十分钟。当然,我们还可以这么写。十点到,他说20点之间每两小时执行一次,听懂了吗?
20:00
那就是其他点不执行。就是十点到20点之间两小时执行词。啊。的这样的一个效果,当然你在这儿你可以测一下,比方说一。到十,你如果你想看到效果,你就一到十这。你这不就可以看了吗?啊星星星星,你看他最终什么时候执行啊,你可以把记录在这里面来把它写一个时间。H啊,这就F_百分号小时是H,再加个分钟再加个秒钟是吧,生成一个啊,你这样就可以测了啊,当然我们现在的时间是不在这个时间段内。
21:07
我们这22,那就从22到30之间。啊,你看一下他多长时间能执行一次啊,你说二二十三。哎,你看看他什么时候执行,就看看效果,你待会等等就知道了啊。好了,这是刚才给大家讲的啊,那这个计划任务呢,这行就这行留着吧,Pass变量,这是留着。但是我们上午给大家讲了,那我们回到刚才说的一大片啊。那么aw k呢,嗯,它更加方便的就是可以对挑出的对应列,那列的话呢,怎么做呢?哎,我们就要加一个杠F来区分第几列。区分第几列?
22:00
F是指定分隔符。比方说大家比较熟悉的这个文件,这个文件呢,它显然冒号作为分隔符aw k-F我就可以指定冒号做分隔符,因为默认它是用空白符做这个文件,它不是空白符啊,所以我们需要用。冒号这个风格符,那你想取第几列?比方说我们想把用户名UID。这两列取出来那非常简单,1323。你看,轻松取出。还有更加方便的是,这我们想把分区的名称和利用率取出来,现在就更加幸福了,为什么呢?因为分格符不用指,它是空白符,直接DO1和DO5。
23:08
是不是很幸福啊?啊,当然有人说了,那你这个百分号还留着呢,摆分号留着那也无所谓啊,你把它也做,可以做分格符,空白符和白括号都参与,那我这儿可以把正能表达式表出来呢,空白符一个空白符以上。和百分号,那这个怎么表示啊,空格加一个以上竖线。百分好当学了吗?幸福了吗?是不是看到没。强大不强大,这是不是这都表达是啊,你看一条命令搞定了,比如说那这还多了一些东西,多了东西这加个条件就完事了,哎,我们这可以允许加正则表达式继续过滤啊,脱字符DVSD,当然这个需要转移,因为这也是两个斜线。
24:27
幸福了吗?是不是一下幸福了很多,以前我们折腾来折腾去,你看一个一段配OK了是吧?好。那当然,我们刚才是少小试牛刀啊,小试牛刀A,大家好多东西咱们接着来给大家介绍。哎,现在已经过去好长时间了哈,看看刚才那文件生成没有。
25:07
菜。我刚才放哪儿了?放到地下。呃,每小时嘛。是吧,23到30之间,那这个命令我看能不能执行成功啊,我先执行一下,看有没有问题。啊,可以执行,可以执行现在的几点。14:27:27分。那我这写的是二三到30。
26:02
是每两分钟执行一次是吧。嗯。这是之前的。每两分钟执行一次。星星星。啊。给它稍微长一点。40分钟,让他慢慢执行啊。
27:02
好了,那这是我们刚才awp啊,那接下来我们来继续看aw k。AP呢,它。支持。打印固定字串。如果是这个printer上面跟。就光写了个print,那么这个它最终执行的效果是什么呢?杠F作为分隔符,光写了一个print,前面没写,你看它是不是相当于把整行都打印了啊,把整行都打印了。那你什么也不写,这不行,你写上划括号,里面写上对应的动作print,那就是所有都打印啊,你可以挑特定的列来打,也可以把所有的列都打出来。
28:08
好。那现在你看,有了awp以后,我们再来把以前想做的事。那我们去找一个访问日志,这个访问日志呢,记录的就是我们当前这个网站的。访问情况,一行就是一个用户的访问信息,其中呢,这个用户访问的IP地址就在最前面。那我们想统计访问你网站的。最多的几个IP。那看一下咱们这有没有那个留下来日志。这个有吧,这个把这个就拿下来就行了。
29:08
好,我把这个日志拿上来。好,那这个日志文件我先看一下它的格式啊。我把它拖进来啊,看一下它的格式。然后你看它这个认知格式很简单。最前面呢就是IP地址,后面呢是用户访问的情况。现在呢,我们要分析一下访问的用户的IP地址。是从。哪些不同的地址来?他们出现了多少次?我想找到那个访问次数最多的前三名。那现在我们现现在用aw k就可以再重新来完成了,那这个怎么完成啊。
30:08
那现在我们有了awk,取这个IP地址是不是很轻松啊,它后面不就是个空白符吗?所以默认awk不就是空白符,那那这个就简单了,那我们是不是aw k就可以搞定了aw k。直接分格符都不用写,因为它是默认的,所以直接写PRINT1,这就取来了啊,选完以后呢,我们还是按照老的方法排个序之后再去再去排一下序啊,再去取前三名,这不就取完了。在面试老问这个题。到时候你答的时候,你就可以用aw呀,用呀,反正你各种方法,你给它写上好几种答案。
31:03
啊,一般面试问这种题啊,他往往就是希望你用一些比较高级的看上去,然后aw k啊,表示你会W题啊,实际上你用就可以做,不过cut显得不如WP高端嘛,啊你用a wp来写。啊,这是咱们给大家说的这个,那这些日志都是类似啊,这种面试题,这种题出的太多,非常多,那取分区用率,刚才我就写过了,分区利用率呢,我刚才用了一个这样的写法,这个这个写法也是可以的啊,这个space space空白符啊综合号,我刚才是空格也可以,总之可以取出分区利用率的。啊。我刚才取的时候我没有用这个space,我用的是直接写空格的方法来实现的啊,我是怎么写的呢?啊,我用的是。
32:10
哪儿去了?在这儿写着什么?啊,这个。我用的这个写法写。啊,这个也是可以的,那这个D啥时候满了,这是啥啥时候就满了。S都满了,上上次写往里写数据的人是吧?啊,当然这个目录对应的实际上就是BOO那个分区,那现在库这个分区里面可能有很多数据,我咋知道到底是谁把这个空间占满了,哎,那你可以这么来看一下。这是不是就看出来这里面哪个子目录或者文件占的空间最大,这不一目了然了吗?不就这个文件占满了吗?
33:08
对吧,啊,当然这个占满了不是好事,删了吧,删了,哎,这个邮件老来。诶,哎呀,这个代码对有问题了,忘了说了,为什么执行失败呢,你看。他不是没执行。你看他确实是二三执行了一次啊,这个从25执行啊,两分钟是不是执行了,但是这个地方为什么没执行成功,就是因为我们里面有百分号。百分号在正在这个计划任务里面是不能直接用的,因为他有特殊含义啊,实际上上次上午讲的时候,这个是一个要点啊,我漏过去了,咱们给他再补充一下啊,再补充一下。这儿。
34:01
这个百分号是一个不能直接用的,它有特殊功能。啊,这边有有有一个说明,我这儿还有说明啊这个。这个。它是表示特殊换行的意思。而且第一个百分号所有字符会当成当前命令标准输入。啊,所以呢,不要这样直接写,这样写会有问题的。你看如果你这么写,然后你发邮件这摆分号啊,摆括号摆分号,那如果你要想用的话,你可以转移啊,你可以把它用斜杠转移了。那否则的话呢,它这个版模块是有特殊含义的。啊,给你最终把这个邮件发过来,发过来以后你看他邮件正文变成什么了,王换行,实际上这是个换行符,他把这个版慕号当成换行服了啊换行。啊,所以像这种百分号最好就别用了,那别用了,那怎么办啊。
35:08
啊,你可以这么来这么来用,那这个地方呢,你可以把它放到一个啊,就别转译了啊,你比方说我们就干脆把它放在一个脚本里面得了呗,对吧?啊,比方说我们就放在这吧,啊就叫就写个test得了,然后把这个代码1T。这这就行了,你放到文件里这就行了,然后给它加上执行权限,然后呢,我们在这个地方把它替换成落下的,看这不就。没问题了吧,对吧,当然我们这个时间是23到40之间啊,现在还有几分钟是吧,再再再多演点八分钟啊,多几分钟啊,多延点。
36:06
那你就可以看到它待会儿执行的效果了。啊,那这个白问号是有意义的啊,那下面这些例子你们可以都可以看一看啊,在我这不解释了,比较简单。呃,有些计划任务他在执行的时候可能有这种特殊需求,呃,因为咱们这个计划任务目前来讲呢,它只能精确到分钟。要达到秒级做不到。那如果就想实现秒级怎么办呢?比方说我就想实秒执行一次,那因为计划任务里面它只多一分钟嘛,那你可以这么办,自己编一个循环加sleep sleep是不是停一会再执行是吧,这不就行了。那你可以隔一段时间执行一次也行。
37:03
那sleep呢,它可以写它后面跟的单位,不仅是秒啊,他还可以跟小时天,这都可以跟。这啊,所以你实际上你想写多少都可以。啊,甚至早期的时候还有个U,不过现在。未来会淘汰,你就不用看了,这个呢,就是微秒。它相当于微秒,知道吧,微秒它不是毫秒啊,是微秒。啊,一秒钟等于多少毫秒?一秒钟等于多少微秒?那你们计算机第一第一章不就讲那个单位了吗。啊。一秒等于1000毫秒嘛,啊,一秒等于再加个1000乘1000的微秒是吧。
38:02
啊,这个你1024是指那个二的多少次方,但是一般来讲,你看生活中都是说千的都是千的啊,在计算机里面都开千算。就是这个平时我们在生活中都是按千算,尤其这个V都是1000啊,都是1000,不是1024,就看情况吧,看情况。嗯,这是咱们给大家说的这些。例子啊,也算是。那我们回过头来看,刚才WK啊。这批呢,我们刚才已经查看了日志信息,那其中呢,我们这还可以取他的时间,你看这里面不仅有IP,中间还有时间,那这个时间我要把它取出来,这个怎么取呢。哎,这有一个小巧妙的东西,你看中的IP和时间,IP在这时间在两个中号中间,你这是不是就时间。
39:05
那怎么取呢?那你看我这么取。我用中括号和空格作为分隔符。取第一列和第五列。这是第一列。第二列、第三列。哎,在这儿。这是第几列?你看我取出来以后呢,它这里面就包括呃零九什么什么什么,那那也就是取到这了呗。他认为这个时间段到这个位置,但是他到这,因为空格它不包括后面的东西,这也参与了。啊,所以你看我们取一下看看啊,比如说我们拿这个,刚才不是已经有一个日志文件了,我们可以直接拿过来用,好我们来试一试。
40:09
啊,你看我们这有一个这样的NGX文件。哎,这个文件我们直接可以拿过来用。你看他是不是取出来时间了。啊,当然这个时间格式呢,我们可以看一下啊。啊,你就看前三行,你看它这个代码怎么写的。这个地方。这个中国号什么意思?外面这个中文号就表示的是正则表达式的取其中的里面的任何一个。啊,记得这种表达是不是有个中号写法吗?这里面是不是说ABC,那是不是就是ABC的任意一个啊,就这个意思啊,所以呢,这里面是半拉中国号或者空格啊,都是当分格符的。干嘛,我取出来了。
41:00
这是第一个。空格隔开,然后这也算分格符,这几个分符了,一个两个三个四个五个这第五列了嘛,对吧,第五列当然这后面就不能再要了,这是空格了,所以他就最多就到这个位置了。这恰恰就是时间嘛啊,后面这个不用管,这是东八区的意思是吧,东八区就取出来了。好,所以这个取值,那另外呢,我们用AWK还以把I把IP地址取出来。啊,IP地址怎么取呢?比方说我们就想把我的网卡的IP取出来。因为大家可以怎么取啊。那实际上这个不就是这第几列啊,当然我们可以先把它过滤一下来说啊,这个这个作为一个单词吧。
42:10
It,因为这个地方还有个IT6呢,所以我加个W,确保它前后没带东西,是不是它就是完整的一行,当然你也可以用size取出第二行来,第二行吧,第二行咋取啊,是不是啊,这都可以。啊,当然我们完全用set也能取出来,不过今天我们学a wp,他们就用a wp wp怎么取呢?啊,这个空白弧直接取Dollar g3,诶三怎么跑后头去了,二好吧,那就二那取上那事实上如果将来变脚本要取IP,还有更简单了吧。
43:05
不过这个命令有一个小小的问题,这个命令有个小小的问题,什么问题你看看就知道了,他和那个aw取出来略微不同。它是有空格的,而你用a wp取出来的东西。他没有空格。啊,所以有可能就意味着多出了一个空格,导致你后续处理还有可能有问题,明白吧。那你加入岗位不就看见了,要不你看不出来呀。啊,这是希望大伙注意的地方啊,这边就有它的处理方法,当然我们以前写过那个赛写法啊赛写法。
44:00
那事实上咱们这个地方可以写。A next part,这个直接就可以在aw搞定,是这个。这个表示包含啊的好,所以我们甚至还可以更加简单啊,更加简单,因为这行只有这行包含ne ne mass啊,所以我们用aw k它这个地方可以写正则表达式匹配ne ma,那这就是包含这一行的,看见没,这不就出来了,那无非再加上一个打印print dollar3就完了。二吧,是不是觉得好简单了,所以大家学的东西越多,有些完成的工作就比以前要越来越方便了,是吧?
45:04
大家觉得幸福了吗?啊,这些用法你们下来都可以试试啊,这个命令,不过呢,这个命令略微有一些小小的问题,那在六上面通用不通用啊,我们是不是希望写一个通用命令。因为在生产中也可能会有六的系统,可惜了了不兼容,因为它的格式它不太一样啊,你看它这个命令里面,它没有那个,你看那个ne mak,它这倒是有个mask。那其他地方看看有没有。啊,所以这个命令格式不太一样,导致就是不能直接用,那不行过滤MAS呗,啊过滤MAS,但是过滤ma的话,它这又大小写。
46:13
是吧,啊。所以这个地方呢,你直接这么用,它存在一个版本兼容的问题啊,那你要是用S取,那就咱们之前取过赛,这种取法,我们是不是管你是什么都能取出来,这是以前写过的。这个S6和八都兼容,所以S呢,它更通用一些,这个命令你看同样的命令在这取,这样也能取啊。好,这是刚才给大家说的这个命令的写法。
47:00
啊,这边有一个面试题啊,这是面试题。这个面试题呢,它有一个文件,里面存放了1234开头的行,并且后面写了一些网站的名称。现在的要求呢,是把马哥一丢com前面的这个东西取出来,就把这些东西取出来。取出来以后,并且再写回到文件里去,最终的效果呢,就是把这个文件在后面又追加了这一部分。那大家想想这块要想实现怎么实现啊,我们就随便写一个这样的文件。看到这个格式了哈,那格式就这样,现在要把那个3w blocks Python那块给它取出来,这个刚才我们已经知道方法了。
48:00
咋写呀,什么。那用aw k-F指定用什么作为分隔符啊,空格和点。是吧,我写在里面不就是或者的意思吗?点或者空格吗?对吧,那当然,那取接着取第几列呀,那第二列。诶行,完事,然后再追加到原有文件里进去了。是不是啊,这个是这么写的吗。啊,就这么写的啊,刚才我看有同学提到了这样的一个就取IP地址啊,这个IP地址六和六和七和八之间,它虽然说格式不太一样,但是有个别是一样的地方,你看这有it,那这个六上他们它也有I,那所以呢,你可以,但是这也有,不过呢,你可以用那个单词啊,单词把它过滤掉啊,就是单词,单词怎么界定一个单词呢?是不是有斜杠中括号,刚才我看哎斜杠这个写法。
49:37
斜杠,这是界定了一个单词的词首词尾吗?然后INE。是吧,这是不是就把那个包含T这行给找到了,对吧,但是找到以后现在问题是这个这是空白,这是空白。
50:01
这个问题是也不行吧。因为这个地方它还是个冒号,所以终究来讲,它的格式它并不是完全一样的,你看你还取出这个来了。你是还得再处理吧,来再处理,用冒号做个分格符,呃,拿这个空格或冒号做空格符。是吧?空格做冒号做分格符,我们可以用杠F呃空格空格或冒号,空格后冒号怎么写啊?号符那括格有几个不知道符括冒号做分隔符,但你这数出来是第几列啊,第三列第四列不对,第四列,但你这个东西通用吗?你这不拼出来的第你看这不对呀,对不上了,对吧?那塞塞的比较好是吧?塞的那个不存在这个格式问题啊,当然你这个取的话也不一定,你可以用IPA取嘛,IPA的话它的格式应该是是不是一样的呀啊用IPA取IPA的话,这个是不好取了。
51:26
I pip这个格式应该是统一的是吧?IP的话这不有个I net吗?对吧,I net这不就取出来了,那这个你要是拿这个取怎么取啊。这个大家可以怎么取啊,那这个你可以把这段加上。啊,当然这个是呃,空白符。
52:01
或者斜线是吧,啊或者斜线那就是杠F空白符一个以上。斜线。这个斜线要不要转移啊,看看取出来。这不行啊,竖竖这个竖线是吧,有个竖线。24那就是前三个呗。就取出来了是吧,说这多了一个这个东西情报啊,这应该是标准输标准错误,然后把这个错误给它隐藏起来。然后看看这边能不能出来。可以了吧,哎,这也算是一种方法啊,方法反正是多样,你自己考虑用哪种方法啊,这是方法相对来讲比较通用,这个六和七。
53:16
都支持了。好了,这是刚才给大家讲的这个a wp的一个用法。那awp呢,它可以支持变量。这个变量呢,它分成内部变量和自定义变量。内置变量就是说系统自带的,你不用管。大家记得他前面见过那个DO12,那实际上就是内置变量。啊,当然我们也可以最低变量。
54:00
我们先把一些常见的内置变量来说一说,第一个内置变量呢叫FSFS呢表示字段的分割符,F是字段,就field域,F呢是分割的意思啊,分隔符,它指定了字段的分隔符,那从功能上来讲跟F是一样的。不过呢,它是个变量。变量要使用的话呢,我们前面有个选项是可以来定义变量的,这个选项就是V选项。可以实现变量赋值,那么变量赋值的时候,他写的时候,这选杠V后面跟上一个变量赋值,这时候一旦定义了,那么它就相当于跟那个F功能是一样了,就字段的分隔符了啊,比方说我们现在用aw k。
55:00
再次取一下咱们之前说的那个ETC的。好,我再取一下ETC的第一列和第三列,那这个地方我们刚才是用杠F来指定分隔符的。现在咱们换一下,换成变量,那就是FS等于冒号,大家看效果是一样的,看见没。当然了,效果一样,你选哪个啊,当然大家肯定会选F,那这多此一举啊,没用啊,哎,不是没用,因为变量并不在于它的本身作用,是在于它可以引用,它啥意思,我这是不是就可以引用变量。大家想过没,你看它现在分割中间不是用冒号分割的吧,中间是不是空白空格符分割的,诶我加上FS看见没,是不是可以引用它呀,你变量下次可以用它呀。
56:14
你肝有这功能吗?没有是不是?你可以引用它呀,啊,当然实际上到1FS3实际上都是变量是吧,它都是变量,不过FS是系统自带的变量,到一德三也是系统自带的变量。哎,那说到这儿,那我们Linux里的变量能不能用呢?比方说我就写一个S冒号。哎,我这能不能调用Linux里的S变量啊,这能调用吗?啊,这是share类的那个变量啊,这个S是share类的变量,和AWK不一样,这个这个是AWK类的变量,能用吗?也可以。
57:09
是不是有意思啊,互相调着来。好,这是FS变量列的分隔符。啊,这边有例子啊,然后我这当初也是这么写的,嗯。啊,当然两个如果都定义的话。会怎么样,会冲突是吧?啊,你看如果都使用,你看这个命令,我们把两个都写上,那就是我既定了FS冒号,又定义了F分号,那你说到底听谁的呀。
58:08
你看他是不是就乱套了。他就搞不清到底用哪个作为分格符了。那既然把所有内容都打出来了,现在就是没有分格符的意义了。那这个地方就不起作用了,然后我这光打了二一,你看打不出来,它全都是整行。所以就打架了啊,当然我这个地方如果写上冒号,他俩换个个儿。哎,这可以。那这个说明什么?说明杠F的优先级好像比是不是比这个FS高啊。
59:01
哎,所以从这就能看出来它背后的这个优先级。啊,这个地方同时指定杠F优先级。更高。当然最好不要在一块用啊好,那接着我们继续来看一下输出的分隔符,默认情况下呢,列和列之间输出的时候,它的这个输出分隔符。大家看它用的是空格,你看我这光写DO1DO3,是不是它输出的是空格的分数空格库,那我也可以通过一个变量来影响输出的分格符叫ofs o,那就输出呗。
60:10
FS就是字段的分隔符。那你输出用什么风格符,你自己可以定义,比方说我们用加号。看到没有,哎,你想用什么都行,等等是不都可以。啊,这是输出的时候。分个府。好,还有就是RSRS指指入的是。字段的分隔符啥叫字啊?那个记录的分隔符啊,记录的分隔符是啥意思呢?默认用什么表示一条记录?啊。哎,记录默认的分格符不就是回车换行吗?一行就一条记录吗?那这个也都能改了,我就不想拿这个跨行,我就想自己指定一个什么作为字段,就是这个记录的分隔符,这也可以做到。
61:15
啊,不过这样指定可能会产生混乱,因为我们习惯了一行换行是一条记录。啊,所以这个指定的时候,有可能会看起来会产生比较乱的情况。那比方说。你看。这个FS,如果FS我用的是空格作为记录的分格符。那你再来执行一下这个命令,你看看效果。空格。哟,这里面还有中文啊啊这好吧,把它一下。
62:11
七个。还有第二,第二第二。这还没提完是吧,哎,这个已经X第二个括号下,那下面这个这个是吧,这是第二个。哎,这应该是单的。六个行了,这就修好了。好,那这是刚才在这个地方看到的。
63:03
RS,那我们再执行一下,那这个应该是替换好了。哎,你看成了乱七八糟的了。男生。那这个就是拿空格作为一行一行的啊,所以呢,你只要是空行隔开的,它都算是一条记录,而不是按照换行来实现了啊,所以这样就乱了,所以一般来讲还是比较改了,这个改的话让你自己就困惑了。啊。另外呢,我们输出的记录和记录之间的分隔符也可以换,默认是一一条记录就一行,但是我就不想拿这个换行,我就想拿自己的一个定义的符号,那你也可以用or or这个呢,同样也会产生一个。不太容易的,你看这是一条记录,这是一条记录,把它隔开了。
64:02
啊,这个也会产生看起来不太容易理解的地方,所以这个一般我们不改了啊,一般不改。还有RNFNF呢,是字段的数量,字段的数量那就是我们用分隔符一旦指定完以后,到底有几个字段啊,比方说我们就想查看一下。冒号分分格符print nf nf呢是number of field,那就是字段的分隔符。现在我们用冒号做分字段的分格符有一行有几个字段呀,七个吧,你看是不是全是七七对吧?诶说到这儿。
65:10
大家猜猜这个结果是啥?NF是总共七个字段,那Dollar那不就是DOLLAR7吗?DOLLAR7不就恰恰是最后一个字段吗?所以用这种方法就可以恰恰取出最后一个字,那我取倒数第二个字段能取吗?减一,哎,直接这么减行吗?不行,要用括号括起来,减了再取。啊。哎,所以呢,当初我们好像取那个光盘里的那个,最后倒数第二个这东西是不是现在我们就有招了。
66:09
是吧啊,你看我们以前是不是很不方便哈啊,现在我们就可以轻松的用aw可用点作为分割符取倒数第二个啊,叫到小括号NF减一,这不就轻松取了,好在排个序在右内置一下我们以前干的活就达到目的了,对吧?你看我们现在完成一个事儿是不是有多种方法了是吧?多种方法。
67:00
这是之前写过的这个啊。啊,这个也是一样,这是取连接数最多的前三个IP,这什么意思这样。大家看我这是不是有远程主机正在连接,哎,连一下我的网站吧,我的网站有没有人访问不知道,你们可以配合一下啊,9527。好,看看有没有人连,哎,不少行,看来都是大伙连的,你看都是这个地址。这个地址应该是都是咱们这个教室连上去的,看查一下地址来自来源哪郑州中国移动是吧,那现在问题来了,我就想查到说有哪些外来的主机正在连,我就把这个地址取出来,我要取出连接数最多的前三个。
68:20
这个面试也老问说你要查到连接最多的前几个,然后如果他的连接数超过多少,我认为它是攻击,我要把它拒绝,那这个怎么取啊,这个。啊,我先把它导出来吧,导出来啊,然后咱们分析这个文件啊,分析这个文件哎。咋取这个现在有AK了吗?是吧?咋取空格和冒号。啊,作为风格弧,那就是空格一个以上吧,或冒号取到几,这不有到了NF吗?去减一还是减二啊。
69:22
这不减二了吗?不就OK了吗?同学们,再再整一下完了吗?啊,当然它这个地方有一个头啊,它这个显示的时候有个头,把这个头删了就行了。它有个头,那把这个取消就行了。
70:00
啊,这个事我们后面马上就讲了。行了,写完了,诶,怎么还有个dress呀,这是最后吧,还有个头,还有个尾巴。那不在这儿,那这dress从哪来的?这就这个是吧,那我这个没有去掉。嗯呃,这个写错了,记录数。记录的number应该是R。一啊,应该是二啊,这个二啊。啊,这就取出来了。NR呢,也是我们马上要介绍的一个变量,表示啥呢?表示这个是establish。
71:04
就是它是建立正在连接的,好,那这是哎,马上咱们就说了,这这个讲记录的编号,这是第几条记录啊,第几条记录,那第几条记录,比方说啊,别在上面听到了吗。然后这个我们都知道,用aw k,我们就可以打印出它的记录来,N是number r10code记录的编号,打印出它的编号来。那就是打印它的编号啊,当然这个编号它本身就是个编号啊,那你也可以直接打这个也行是吧,一二三四四十五行是吧,四十五行啊,比方说你可以把它的某一列打出来到一,然后杠F冒号是吧。
72:16
这第几行儿。不过呢,这个地方稍微有一点点,如果我这有俩文件。他是不是把两个文件合成了一个文件来进行排序了,能看见吗?那如果一个文件,我想单独统计它的行。有个叫FNR的那一个文件单独统计,你看到这的时候,它已经换成从一开始了,又是不是一个文件统计一次啊,它自己独立编号嘛,每个文件独立编号。那这就是FNR。
73:04
啊,那你看这个就是取第二行。把这个IP地址NR等等,就是如果第二第二行。这个行的编号第二行的时候,我就打印这个。啊,也是可以的。FNR,还有fair name fire name呢,就是取文件名,我这还要把fire name再加上啊,你每个文件都有自己的文件名,我也可以把文件名补上,你看这是不是就显示出文件名来了,这俩不同文件。对吧。就是他自己带的电量。还有就是AR gvrgv呢,它表示的是这个是个数组啊,表示命令行所给定的各参数。
74:03
啊,直接开这个命令啊。看那这个命令,它是把这个命令执行的时候打印出的它的第一个参数。还有就是参数的个数。这个AR g VAR GC。ARGV是参数的具体内容,而ARGC表示它的参数个数。那个数有几个呢?你看看他有几个,三个,他认为整条命令有三个参数,那三个参数分别是谁呀?那哪个算第一个数个算第二个数。那一般我们可能会这么去理解。比方说这算参数,这算参数,这是参数是吧,事实上他真不是,那这个V呢,就能看出来就这个。
75:03
V能告诉我们具体这三个参数是谁?V0就是表示第一个参数。他既然认为aw k是第一个参数,而一自然就是第二个参数,第二就是第三个,第三个参数明白了吗?那就意味着它中间这不算参数。看懂了吗?当然再往三还有吗?没了吗?就三吗?012了,所以这个三的参数是从这么来。中间这个program这段代码,它不算参数。对吧。好,这就是咱们给大家讲的这样的一个变量。啊,当然我们除了自定义变量也可以自自定义,就是我们除了我们刚才内置变量也可以自定义变量,自定义变量呢,你加个V加个数值就行了,你看这个例子。
76:00
那这个例子我们看一下最终效果是什么?你看啊,我这算V,这是不是对这个T1和T2,诶,这是俩变量同一统一复制成一个变量值,这是允许的,而你可以理解成TAG1等于hello awt t2也等于hello awt,这就串联起来赋值,这也是允许的,那么允许完了以后呢,我们在这去执行begin啊,在这里面复制也行啊,然后呢,去打印它。啊,打印了两个,当然这个变量赋值呢,我们是在这两个地方都赋值了啊,就在这赋了个值,在里面又再次赋了个值,那事实上如果我们只用一个就够了,不用两个都会啊,只有只有一个赋值它也能做到。啊,当然如果你在里面复制,外面就可以不用复制。TEST1 test2。
77:00
杠V反正就多了个V,看到吗?哎,就是它两个地方都可以复制,一个在语句里面复制,一个在语句外赋值,当然这个语句里面赋值和语句外赋值,最终到底如果都赋值听谁的呀。你觉得听谁的呀?最终打一个HELLO1 hello2。你想谁愿你进呢?是不是二跟你进啊,当然二了,对不对。哎,这是都可以啊,不过一般不会这么干,你这不故意冲突嘛,是不是啊,所以这就是他背后的写法啊写法。把它调一下次序啊,两个都可以当这故意的写个二,这写个hello,一。
78:00
那最终打出来的应该是二。二的降。可能有点差距。这个这儿少了一段吧,是不是一。然后泰尔。这样的是吧。呃,但是我这个地方怎么,呃,太子一是没打出来,太子没一没打出来,太子一没打啊,我这T1和T22个都打,但是T2等于喽。看看那TEST1被负了,然后啊,这啥意思呀啊能明白了,这个T1等于T2等于hellow k它是不是把整串都当成一个变量值了,对吧,也就是说并不是说都付给了它啊,准确的说,应该说T1它存的内容是这两个值的组,它当全部都当成字符串了,全当值符串时候,你打T1的时候,它有有值啊,就这串啊,但是T2是不是没有这个变量轴,没有变量就空嘛。
79:35
啊,它是这个意思啊,应该是这个意思,就你连着这么串着复值是不行的啊不行,这样不能这么串着复值在里面,好像里面可以,呃,里面我们串在一起,里面可以,外面串在一起不行。那我们这么串,你看里面可以,外面不让串,外面不让串。
80:00
嗯。啊,里面串在一起可以,不过最好是分开。好,这是咱们刚才给大家讲的内置变量和外置变量啊,这些呢,你都可以来试一试,那另外awp呢。在执行的时候。变量赋值可以在语句的外面,也可以在里面语句的里面啊,所以呢,大家可以看一下这段代码。那如果是这段代码,你猜猜最终的结果是什么?看啊,用冒号做分隔符,对six附了一个mail,打印DOLLAR1SIX h。这个A是个变量,但是变量我又对它在后面赋值了,也就是这赋了个值,这赋了个值,然后打第一列性别和年龄。哎,这个变量还没有赋值的时候,我先打印它,这样行不行啊,没钥是我在这已经就是这个这已经赋过值了,但是A是后赋值的这行吗。
81:11
这是在于什么?你看出来了吧,那后副值行不行,哎,实际上不行,因为第一个没了。第一个18没有,为什么第一个打的时候A没值,后面你才负的值,所以第二行就开始有了。啊,所以说白了还是变量,必须先定义赋值后再引用,对吧,它这个命令执行有次序啊。呃,咱们还可以把这些命令啊,放在一个文件里,用杠F调用,这也是可以的,也就是说你现在写的这一串,你如果你觉得太长,你可以把它写到一个文件里啊,比方说写到一个a wp的test文件里啊,你把这串写进去,这个单引号也可以不写啊,你就写在这里面,那这个文件写在这,然后呢,用aw k-F就可以调它。
82:20
啊,后面跟上你要处理的文件啊,当然这个分格符还得该纸纸,那效果一样吗?一样。啊,这个杠F这种用法是不是太多了,好多命令都支持对吧。好,这就是咱们给大家讲的这样的一个。变量的用法啊,那初步的呢,我们已经刚刚对EWK有一个感性的认识,那咱们休息一会,还有更为功能强的啊,40回来吧,啊,40回来休息会。
我来说两句