00:00
接下来呢,我们再来介绍另外一个文本分析工具,那就是传说中的aw k啊,Aw k之所以叫这个名字呢,是因为这三个字母就是他的三位创始人的首字母啊,那可能有些同学也见过另外一个表述叫做jaw。他们俩其实是一个工具啊,呃,就是本来aw k这是。初始的unix环境下的一种标准的工具实现,那JWK呢,就是aw k的。我们所说的g nu,哎,Lu这个组织里边的具体的实现啊,那所以整体来讲它就有更多的扩展,在三套七里边,我们现在的这个系统里边啊,大家也可以看一下我们当前的系统里边,诶,我们可以去找一下。有没有对应的aw k这样一个命令来,我们可以看到它在user b下面,然后我们可以去LL看一下user bin这个目录下去搜索一下aw k。
01:06
一搜索我们其实就看到了啊,它里边可能有各种各样不同的实现,然后我们看到本身aw k这个命令,它其实是一个软链接,它就指向了jaw k啊,所以在三到七里边也是啊,我们使用aw k本质上用的就是jaw k啊,你用这两个命令其实都是一样的。啊,那这个工具呢,到底是什么东西呢?诶,我们说它是一个用来处理文本文件的非常强大的分析工具,可以说啊,这是我们目前见到的用过的最为强大的文本分析工具了,它的主要功能就是把文件逐行的读入,然后呢是以空格作为默认的分隔符,然后每一行进行切片。相当于我们就想到啊,之前这个cut,我们不是把一个表格每一列切出来吗?像现在这个aw k,它就是真的把这每一行每一列全切开了。
02:02
然后切开的每一个东西,然后再去进行复杂的分析处理,所以它的功能确实是非常的全面啊,功能很强大,接下来我们看一下它的这个用法,它的语法是什么样的呢?首先还是一个命令调用啊,命令就是aw k,然后后边紧跟着的是当前的选项参数啊,跟平常的这个命令调用都差不多,然后呢,后边这一部分就比较诡异了,那这个我们看到它是单引号引起来的一部分,调用的时候就是要用单引号把它引起来。这部分我们先不管,然后最后呢是一个file name是一个文件,也就是他也是分析我们的文本文件嘛,跟cut一样,最后把这个文件名跟在后面就可以了啊,当然平常我们有时候用的时候也不需要每一次都是后边放到这个文件里边啊,把文件放在最后,也可以是前面有一个管道的这个输入啊,比方说我前前面我们这个cat什么东西。点点点啊,然后一个管道交给aw k去做输入,那后边这个文件名我们就可以省略了,所以这两种用法我们平常都是都需要熟悉啊,接下来最关键的就是中间这个单引号引着的这一部分,有点奇怪,它的组成是什么呢?它的组成是。
03:17
我们看到了它的组合是一个pattern,一个action,一个pattern,一个action,哎,所以这里面的关键就是一个模式。Pattern对应着一个action,那这个模式是什么呢?这其实就是说我们在aw k这个命令里边,需要去在文本里边所查找的内容,也就是我们的文本匹配模式,那到底写的是什么呢?就是一个正则,诶,所以我们看到啊,前面这里用斜杠。这里必须要加上斜杠,里边放着的就是一个正则表达式。这里边定义出来的就是我们按照什么规则去提取文本,按照这个规则提取出来的文本,我们要干什么事儿呢?啊,正常来讲,我们这里提取出来的当然就是一行数据了,那一行数据干什么呢?诶,对于找到的这些文本执行后边花括号里边的action啊,所以这个action理论上来讲,这就是能够执行的一系列命令,所以我们发现啊,这个action就像一个代码块一样,花括号括起来的一个代码块一样,或者说就像一个函数一样。
04:29
甚至我们可以想到它就像一个脚本一样啊,所以呃,Aw k啊,其实是非常非常的强大,强大就强大在后边,我们可以根据正则去定义各种各样的匹配模式,然后定义各种复杂的处理命令啊,一系列的命令,甚至我们还可以定义这个多个模式,多个正则,然后处理多种情况,这就是aw k的主要的语法啊。那前面还有这个选项参数,这里我们也要说一句,就是杠F,大写的F,它是指定当前输入文件的分隔符,默认是空格啊,如果是别的话,我们可以单独再指定一下。
05:09
另外还有一个杠V啊,杠V比较有趣,它可以在外边单独去赋值一个用户定义的变量,也就是说我们在这儿单独定义一个变量,然后在后面就可以使用了。哎,为什么还要定义变量呢?这就是我们说的啊,这儿本身这个action相当于是一个代码块啊,那就是我当前满足这样一个pattern,满足这样一个正则,得到的那些结果就近这个代码块来进行执行。哎,这就有点像if,符合我们前面的这个匹配规则,那么就执行后面的这段代码。如果是这样做的话,那代码里边当然可以使用外部定义的变量啊啊,所以这个功能可以说是更加的强大啊。接下来说了这么多,我们可能还是觉得有点有点困惑啊,那就在具体的使用案例里边看一看aw k到底能干什么事。
06:01
好,那接下来我们看文档当中给出的案例呢,我们还是去操作ETC下的password啊,那这里边我们文档当中给出的是把这个password文件作了一个复制,复制过来之后呢,诶,我们就直接可以把这个文件作为后边aw k的参数啊,最后的这个文件参数跟到后边了,那我们现在呢,其实也不用这种方式,因为我们知道可以直接cat ETC下的。Pass的这个文件,然后后面加上管道操作服,后边去做aw k就可以了,哎,所以这两种方式本质上都是一样啊,所以接下来我们就不复制了,然后我们看第一个需求,第一个需求是搜索passw的文件已root关键字开头的所有行,并且输出该行的第七列啊,其实之前我们做过这个passwor文件里边的解析啊,第七列最后一列其实就是我们所谓的每个用户登录它的那个shell控制台啊,或者说就是我们使用的那个解析器啊,如果是普通用户的话,一般就是b bash啊,那接下来我们就看一看这个应该怎么样去实现。
07:06
其实这个功能呢,我们之前已经使用grape和cut已经可以实现了啊,之前我们就已经做过截取,当前我们首先先把这个文件先cat出来啊,ETC password。啊,那我们知道,如果说你想要找到已root关键字开头的所有行的话,那我们直接做一个grape不就行了吗?Grape后面也可以跟正则吗?然后我们这里就是开头,那当然就是上间号,然后root。接下来的话,把得到的结果筛选出来的行,我们要截取它的第七列,那当然这个截取列数,这是cut的拿手好戏嘛,所以接下来我们再做一个cut,然后杠D,当前我们的分隔符是冒号截取第七列,杠F7。这是之前我们做过的啊,直接得到的就是这个b bash可以考察当前它,呃,登录使用的这个控制台解析器到底是什么,是bash。
08:02
那这种方法我们会发现,呃,其实主要就是做了两个管道操作,使用了grape和cut个工具啊,双重的这个命令去解析了这个东西,相当于是先做了一个行的提取,Grape做行的提取,然后cut再做一个列的提取。我们现在呢,有了aw k aw KA,它的好处就在于不用这么麻烦了,一个工具直接把行和列的操作全部搞定,所以我们先把对应的password。先拿到,然后接下来这个管道过来之后呢,直接aw k。按照我们这个定义的规则,Aw k也要指定当前的分隔符是杠大F。我们现在是冒号啊,因为它默认是空格分割嘛,所以现在是冒号的话,我们要杠F指定出来,然后接下来后边是一个单引号引起来的过程啊。最后还有一个文件名,我们因为是管道过来的,就不用加文件名了,所以最关键的就是这个单引号里面,单引号里边要写着的是一个pattern,一个action,哎,正则提取出来后边执行操作,哎,那所以这里边很简单嘛,我们这个正则不就是前面说好的,哎,注意要用这个斜杠,把它呃放在斜杠里边,那不就是我们说的上间号,然后root这样一个正则吗?
09:20
然后后边要执行的内容用一个花括号括起来,就像代码一样,诶,那这里需要注意的是aw k本身就给我们提供了一个叫做print的操作啊,就是你想要输出什么,直接用print打印就可以了,哎,那我现在要打印的是什么呢?其实通过这个提取之后,你可以认为就把我们当前啊if满足这个条件判断把提取出来的数据就都传入到了这个代码块里面。那传入进来的这个代码块,相当于就是每一列就成了我们这个代码块的一个参数。那我们提取的第七列在这里边应该表现为什么呢?非常简单,直接就是。
10:02
到七,哎,就像我们一个函数,或者说一个脚本,哎,对应的这个参数第几个一样,哎,所以我们看这个aw k,它强大就强大在这里啊,我们一回车看一下,得到的结果完全一样。啊,所以相当于就是aw k这一个工具,把我们前面grab cut2个工具做的事儿全干了。好,那接下来呢,我们再来看一看其他的一些需求怎么样去实现,呃,下面又有一个需求,还是搜索password文件已root关键字开头的所有行,接下来呢,我们要输出的是第一列和第七列,前面我们也输出过嘛,167列,那它现在是输出第一列和第七列,很简单,注意这还有要求输出的形式,我们还要自己定义,它们中间呢,要以逗号做一个分割。诶,这个我们看起来好像在之前啊,我们使用这个,呃,Grape和cut,好像这个就不太好实现了,比如说之前我们的这个做法,那就是直接看得出来之后啊,然后这里杠F167,诶那这里边只能按照原先啊,原始文件里面默认的这个分割符冒号去做一个分割,我们现在是要以逗号改成逗号做分割,这怎么改呢?
11:17
诶,在aw k里边可以做得到,我们这里当然就是比方说我当前是要的是第一列和第七列啊,DOLLAR1DOLLAR7,然后我们发现这里面是个代码块啊。既然是代码框,那当然就可以做字符串拼接呀,哎,所以DOLLAR1DOLLAR7我中间再加一个逗号,这样一个字符串不就完了吗?诶,当然这个逗号必须要用双引号引起来,这才是字符串啊,那所以接下来一回车,我们看到得到的就是逗号分割的这两个字段啊,那当然了,如果说我们还想再加一个DOLLAR6的话,那也是一样,然后后边我们再加一个引号引起来的。逗号,我们看到这三个。字段这三个列就全用逗号分割了,哎,所以我们就看到啊,这输出的形式我们可以各种各样去定义,比之前灵活很多。
12:09
接下来我们继续看啊,就是aw k呢,它还不仅仅只是,诶,我们当前筛选出来这些行可以做对应列的这些组合,不同的组合它还可以干什么呢。还可以增加不同的行,好,接下来我们继续看啊,下一个需求,下一个需求是我们现在哦,不再去以root关键字开头做筛选了,那也就是默认情况,我们不做正则的匹配,所有的行都应该输出,而且呢,只显示现在是对列有要求,只显示它的第一列和第七列,哎,那我们知道这个就很简单嘛,呃,而且以逗号分割,这不就跟之前这个做法一样吗?只是把之前的我们这里的这个正则去掉不就完了吗?好,把这个删掉。这是还带着第六列,我们把这个可以删掉。只要第一列和第七列。
13:01
逗号分割,哎,当然了,这里面数据非常多啊,然后这还没完,我们在这个输出的基础上还要再增加一些东西。在我们输出的结果呢,所有行前面增加列名啊,User shell,然后在最后一行再添加一行数据啊,当然这个随便添加什么都可以啊,我们看看在当前这个aw k里边到底该怎么添加呢?它里边其实是有两个比较特殊的,我们可以认为就像是关键字一样的东西,那就是一个begin,然后还有一个and。Begin是所有数据行在读取之前执行的,而and呢?那就是在所有数据读取之后执行的。所以我们当前插入的这个代码块呢,就是一个在begin这里,一个在and这里,它们表示的是我们当前执行的两个不同的位置。啊,所以接下来我们可以在,呃,具体在这个控制台里边啊,还是把这个做一个实现,做一个扩展啊,那现在我们的做法就是在这个单引号里边,首先前面需要加一个begin,大写的in,然后后边加一个画括号啊,这个画括号我们就是想写什么写什么,就是代码框嘛,Print啊,那比方说这里边我们直接就是user shell。
14:23
那后边在整个全部执行完成之后,最后还应该有一个end end。然后画括号,里边又是随便写一句最后的输出,比方说我们就说这是。And five。接下来我们看一下,最后就会输出一个end of five,那前面呢,最前面呢,当然就会有一个类似于表头的东西了,User shell,所以我们看到这个aw k,它真的是自定义啊,各种各样的自定义方式五花八门,可以说是功能确实是极其强大的。
我来说两句