00:00
在上一节中我们介绍了正则表达式,那其实我们说正则表达式呢,一般都是用来处理文本或者字符串的,它一般呢就要结合一些文本处理工具来进行使用啊,那所以我们接下来要介绍的就是文本处理工具,这其实也是对于Linux shell编程的一个更重要的扩展啊,我们知道啊,Shell本身里边是有一些内嵌命令的,那内嵌命令呢比较少,功能比较局限,更多的呢是通过外部命令来进行功能的扩展,那常规的一些外部命令功能可能比较简单啊,比如说。我们直接LS啊,去看一下当前目录下的内容啊,这个就一下就执行完了嘛,但是有一些命令就会比较复杂,它的功能也会非常的强大,有更好的扩展性,那这一部分呢,我们往往就把它叫做工具啊,所以接下来这章我们要介绍的就是专门用于文本处理的是工具。首先我们要介绍的呢,是cut啊,Cut顾名思义啊,它的英文名字本来就是剪切、裁剪的意思,所以它的工作也就是对于文本文件进行数据的剪切。
01:14
简单来说,那就是我们当前有一个文件。里边呢,哎,整体我们可以认为它的数据就是一张表格,每一行数据,然后里边呢,按照不同的分隔符再分成不同的列,那这个时候我们的cut就可以派上用场了,Cut直接就可以按照默认分隔符是制表符,诶,它就直接把它每一行都分开,然后可以直接裁剪出某些我们想要的列数据来啊,它进行裁剪的时候,可以剪切出不同的字节,字符和字段,并且把这些东西直接输出,这就是cut的用途。我们看一下它的基本语法。非常简单,就是直接cut cut我们使用的时候啊,工具也就相当于是一个命令吧,所以就是一个命令调用cut,命令后边跟着的是选项参数,然后接下来呢,是想要去裁剪的这个文本文件的名称啊,当然了,这个文本文件的名称有时候我们也可以不指定,那就干什么呢?把这个cut用在管道当中,就前面比方说诶,我们直接LS,然后后边接一个管道,把得到的内容直接去做cut,这也是完全可以的啊,那比方说我们做一个cat。
02:26
Cat一个文件的内容,或者说看某些东西,然后做一个管道,接下来去cut。完全是可以的,那这样的话就相当于把我们前边命令捕获到的文文本,然后当做了我们后边的file传给了cat去执行。这里面我们重点要介绍的是这个选项参数啊,选项参数这里呢,比较常见的主要就是这些,一个是杠F,杠F指的就是说当前我要提取的列号,哎,我们当前不是相当于是在一个表格里边去截取吗?哎,那当然就是说把它按照每一列都拆开了,当前你到底要提取第几列呢?用这个杠F来指定。
03:08
然后还有一个杠D,这个也非常重要,这是我们所说的分隔符默认表里边吧,分隔符就是杠T这个制表符,那我们可以单独去指定,比方说我们这个文件里边分隔服饰,哎,空格也有可能是冒号,也有可能是分号,逗号,这些都是有可能的。那另外最后还有一个杠C,杠C指的是要按照字进行切割啊,然后后面加一个N,表示我们取切割字符的第几列,其实也就是第几个字符了啊,所以接下来我们就在实践当中。具体来看一看这个cut到底是怎么用的。我们这里首先做一个数据的准备吧,我们就照着文档里边,我们把这一部分内容复制到一个叫做cut.txt这样的一个文本文件当中,然后进行截取,好我们到控制台这里来。首先wave一个cut.txt。
04:01
我们直接把这个信息先复制进来啊,然后接下来保存一下。接下来呢,我们就使用cut命令对这个文件里边的数据进行一个裁剪啊,哎,我们首先先看看一下里边到底有什么东西啊,诶,我们看到是按照空格分割的一系列的。字符,哎,我们看到这个东深啊,过安镇啊,那那后面这个到底是什么意思,我们现在好像搞不清楚,我们直接怎么样呢?可以直接来节选一下当前他们的第一列,把第一列全部拆出来,这个时候使用cut就非常的方便,我们看怎么样去截取当前这个文件里边的第一列,诶,就是我们这里看到的啊这一串数据。直接来一个cut,后边要指定杠D,当前的分隔符,现在不是制表符,应该是一个空格,好给一个空格放在这儿,然后后边加上杠F参数指定截取得到的第一列啊,后面跟上我们当前的文本文件的名字,看着点TXT看一下哦,我们看到当前的。
05:08
第一列原来输出的是一句话,这是东莞我来了啊,所以我们看到如果说啊,我们当前收集到的这个文本,它本身是竖排的话,那我们可以用这个cut命令非常方便的把我们想要的信息提取出来啊,所以这个看起来还是很简单的啊。那当然了,Cut命令肯定不简简单单的是这么简单的一个操作啊,除了截取某一列,我们可以截取第一列,当然也可以截取第二列啊,那另外呢,还可以同时截取很多列,那比如说我们要截取第二三列,那怎么办呢?诶,这里边非常简单的方式就是就跟正则里边那个写法一样啊,逗号分割表示一个区间范围。二三,这就是表示截取二三列,当然了这个文件里边并没有第三列,所以说我们相当于输出的就是第二列,这里我们得到的是啊,是深圳我来了啊,啊,同样就是我们每一列都是一句话。
06:06
当然了,这一个二三列的截取我们看的不是很明显,所以我们可以换一个更加明显的文件来看一看,比如说之前我们用过的ETC下边的password这个文件,我们把它cat出来之后,先去过滤一下,诶我们还记得啊,有很多自己定义出来的用户,诶,我们实际的这些用户,其实他最终的这个登录终端都是bash结尾的。都是并bash,所以接下来呢,我们加一个正则的过滤,Grape BA Dollar,以BA结尾,我们先把它拿到,那这些信息呢,有点太多了,接下来我们希望做一个提取,诶,那本来它并不是表格,那我们怎么提取呢?诶,没关系,我们可以按照中间它的这个冒号分隔符进行一个。剪切,然后进行提取啊,所以这里面我们想提取的关键信息是什么呢?首先第一列这是我们的用户名,然后最后一列这是我们的登录的终端啊,就当前我们这个TTY,那在最后一列之前还有一个这个比较重要,这是我们的加目录啊,就当前每一个用户他的主目录,诶,所以我们当前应该用的是截的是第几列呢?哎,这个要仔细看一下啊,冒号分开之后,第12345。
07:22
六七,哎,所以我们应该是1670,那我们当前的这个命令就应该这么写,前面先把它获取到后边再用一个管道进行处理,进行cut,杠D,我们当前的分隔服式冒号,然后呢,杠F167。后面就不需要再加文本文件的名字了,因为我们是从管道这里获取它的要截取的内容。一回车我们看到当前就已经把所有我们截到的东西都已经拿到了,哎,这里看到的就是root,然后杠root,这是它的加目录,后边是b bash默认的登录终端啊,那通过这个例子我们也可以看得出来,其实这个是很灵活的,我想截多少都可以截,但这就有另外一个问题了,假如说当前啊,我们这个分拆分之后得到的那个列特别的多,然后呢,我们想截取的列也很多,但是呢,我们想截取的列并不是零零散散的,我们就是比方说从某一列啊,从第六列开始,后边的所有的我都要。
08:26
哎,那假如说这个第六列开始,一直到100列,难道我每一个数字都要写在这儿吗?这就太复杂了啊。其实是不用这么去做,在。Cut这个命令里边,这个工具里边,它可以直接写成,哎,比方说我们这个第六列之后,那怎么办呢?就是六杠,哎,我们还记得之前正则里边的那种写法吗?A到Z0到九表示当前选取的一个范围,哎,那所以如果说我们直接六杠后面不加结尾的这个数,相当于就是直接把后边的部分全部拿出来了。
09:01
所以这里其实跟正则里边我们所处理的这个规则是类似的啊,啊,就比方说这里,如果说我提取的不是1673列啊,我提取的是。一到四列的话,哎,那我就写一个一杠四,诶这个也是完全可以的,那假如说我要的是从第四列开始,一直到最后,一直到第七列,哎,那我就直接四杠就可以了。那如果是第四列之前呢,诶,我也可以是直接杠四啊,这个跟一杠四是一样的啊啊,所以这就是我们当前一些比较快捷比较方便的操作,诶在这文档里边我们也有一个具体的例子,我们可以去获取系统的pass这个环境变量值,因为我们知道它里边也是用冒号分割的嘛,所以我们可以去截取某一个对应的这一个路径后边所有的路径啊,比方说我们截取第二个冒号开始之后的所有路径,那第二个冒号开始之后,如果按它做分隔符的话,那就应该是第三列开始啊,所以我们这里边可以直接eo。
10:01
Dollar pass。我们先看一眼哦,Dollar pass,我们这里边其实比较少啊,只有只有四,呃,只有五个路径,所以接下来呢,我们如果做一个管道。然后。把它做一个cut,呃,杠D,我们这里用到的是冒号做分隔符后边的列数,如果说我们截取的是第二列之后的,那就是二杠,诶,那我们看截取的就是从user local并开始到后面的所有内容,诶如果按照我们前面这个文档要求的第二个冒号开始之后所有路径,那应该就是user local bin。这个冒号之后的所有从user病开始,那应该是三杠。哎,这样的话就是后边的三条路径,所以整体来讲这个还是非常简单的。然后最后我们再来看一个比较有趣的案例,那就是我们可以去切割一下当前能够获取到的IP地址,诶,那我们知道如果想拿到当前IP地址的话,有一个命令叫做if。
11:04
这个可以获取我们当前所有的网络信息,IP地址就都在里面了,那把这个拿到之后,接下来我们应该怎么做切割呢?诶首先比方说我们知道啊,当前我们自己所在的这个局域网,其实就是ES33后边的啊,这个是我们的。127.0.0.1,这是我们的回本地回换地址啊,然后这个是virtual b20,这是我们的虚拟网络的地址啊,所以我们最关心的应该就是这个ENS33,哎,那如果单独想看它的话,这个我们也不用筛选啊,直接if con后面ENS33直接就可以获取到单独这个网络的信息,然后接下来如果我们想要切这个IP的话,那显然就是它嘛。对于这个IP我们怎么样去做一个切割呢?哎,那首先我们应该把这一行先提取出来,好,这这相当于一个表格嘛,只在这一行里边有,那我们先把这一行提取出来,这个提取的话,哎,用grape就最好,我们看到grape相当于是提取行这样的一个命令,然后我们可以用cut再来进行列的切取,那这里grape的话。
12:11
我们看一个特殊的啊,这个it其实下面还有一行也有,所以我们用后面这个net mask。直接grape that mask啊,那这个时候就把它直接切出来了,然后接下来我们做一个什么操作呢?哎,那就是我们看到现在的分隔符应该是空格,那我直接按照空格做一个cut,直接cut-D。然后空格。啊,那当然,如果这么切的话,我们到底是需要第几列呢?哎,这个就涉及到一个问题啊,就是前面这里有很多空白,哎,所以这里边的空白个数其实就决定了我们当前到底是要第几列啊,那如果大家仔细按照上面的这个字符去做比对的话,你会发现啊,总共前面应该是有八个空格,哎,所以如果说按照空格去做拆分的话。
13:02
前边本身就应该有八列,然后这里的it是第九列,后边我们的IP其实是第十列,所以这里边需要看的就是仔细一点,把它截取出第十列,我们就可以得到当前的IP地址了。当然如果觉得这个太麻烦的话,我们也可以使用一些比方说特殊的这个字符切割啊,比方说这里有一个I,哎,那我们就用这个I做一个切割,只不过你切完了之后,后面这一部分就还得继续切啊,啊,那所以就可能进行多次切割,也可以得到对应的结果。这就是我们使用这样一个cut命令去拆分得到当前IP的一个过程啊,那假如说像前面我们这个I跟F。得到的这个IP很多,假如说我们想把所有的这些IP啊都切出来呢,诶,那就相当于这真的是对一个表格的切割了,同样也是可以,只不过我们就需要。前面去掉这个ENS33,同样是GR,当前的net mask这一行,就把所有带IP的这一行都拿出来了,后边同样还是按照空格切分之后选择第十列,就可以得到相应的三个IP地址,哎,所以这个还是非常实用的啊,在实际工作当中也经常会用到,这就是cut工具。
我来说两句