00:00
大家好。欢迎大家继续收看上硅谷的云计算课程,我是沈超老师。这节课我们继续来学习aw k啊,那我们这节课来看看aw k的内置变量。那其实啊,我们前面看,我们前面打印这个第几列第几列对吧,这里。那这个Dollar其实就是它的内置变量的一种,那我们这里看看这里Dollar dollar0我们说过了,它代表是你当前读入行的数据,当前读入的整行数据放在刀勒零里。到了N呢,就是你当前行的第几个字段,也就是第几列的数据,哎,我们前面是不是在这里是打印机第一个字段是吧,那读入第一行。对吧,那么它的第一个字段放在这第一个字段,第一行处理完再读入第二行,第一个字段也放在这对吧?所以在这里这个刀N它是当前行的啊,目前读入行的第几个列第几列的字段啊,这个我们都用过了,对吧?那。
01:02
我们这里呢,主要学的是这三个内置变量,后面这个一般用不到,你们如果有用的话,自己看看好吧,那我们常用就这三。那这是啥?那我们首先看一下这个,这个是最常见的,就是指定分隔符。各位,我们前面是不是在这里,我们在SH里面,我们是不是写了一个student的这个例子,对吧,这个文本,那我们现在要截取的时候,我们是不是都是什么aw k对吧,那我们截,比如说我们打一。打印第一第二列打印姓名对吧,那我们。干嘛?直接那个什么就是STU啊,那这个它是。默认的情况下,Aw k是以K不键制表符或者空格作为分隔符的,OK,那也就是说这里啊,Cut啊,Cutt是只能以制表符作为分隔符,但是用空格做分隔符它不识别。
02:00
那我们的aw k呢,是技能也推不进,也能以控制对吧,所以我们的DF命令,我们昨天是不是之前的课我们是也讲了,我们拿拿它来结缔,这是12345对不对,是不是也是可以的,拿这这个是它这个输出是用空格作为分割了,所以卡就不行了,那我们就只能用谁aw k对吧。那我们就可以干嘛打印它的第五列。这个时候是不是就可以提取出我想要的列数,对吧,但是啊各位,那如果我要截的这个文件,比如说我要截的是他做的呢?哎,我用cut来接是不是也是可以的,但是我万一我非要用aw k来接呢?其实我说如果这个文件真的有明确的分割符。因为如果我只是单纯的就只是把这个列截出来,那还是推荐看,因为看着简单嘛,对吧,这个杠D指下分割符,然后也好理解杠F是不是截取第几列,第一列第二列写就行,对吧,那但是啊看定太简单了,它有些东西处理不了。
03:04
比如说我要判断一下这个什么,这个这个UID是多少,然后我才能执行,这个时候看了就处理不了,那这个时候如果要是用aw k,那我首先要做的事情就是要指定分隔符对不对,那这个时候我们就需要用到FS这个内置变量来指定分隔符了。那么试试各位。那我们来尝试一下,比如说我想截取我们这个这个用户名,用分割符用cut来解,对吧,那我想先把普通这个,呃,什么为用户给排除在外,我只截取出来普通用户啊,我们就能登录的用户,超级用户和这个普通用户,那接下来我想截取这些用户的用户名称,对吧?那怎么办?那我们就可以aw k那么单引号。那么小心,这个指定分格符是一个单独的动作。所以呢,它是单独一个大括号,而打印的是另外一个大括号,哎,回来我们看啊,回来我们看,我们的这个aw k的格式是这样看。
04:06
在单引号当中。是可以执行多条动作,多个条件和多个动作条件写在中大括号外面,动作写在大括号里面看到了,所以啊,这个指定分割符是另外一条动作,大家小心,OK,所以需要单写一个大括号,那么大写的FS等于双引号括起来冒号,分割符是冒号对吧?然后呢,第二个动作是什么?分割符是冒号之后知道了分割符,那么打印什么?打了打了他的。这个用户名OK,好,这个时候我们会撤,诶你会发现。后面两个。正确执行了,答应的是第一列。但是第一个他把整行打出来了。他没有,没有把按摩号作为分格符打进基病。原因。
05:01
各位,我们都说过了。我们设aw k是啥?他先把第一行的数据。读到aw k里面,再用它来处理各位,换句话说。我先把整行数据都读进来了,附在了刀勒零里,已经附进来了,刀勒一什么都已经附好了,我才看到你写的啊,分割符是问号。这个时候第一行数据已经来不及了,你这时候让我打印,我只能用默认的方式,认为空格是分隔符,你这一行没有空格,那我就到了一,我就会把整个这一列,这这一行全部打印出来。那到了第二行读的时候啊,我现在已经之前已经知道了啊,原来分隔符是这个,然后我这时候就可以正确读取,换句话说他是先读数据读到aw k里,再拿动作处理,这个动作写满了。那怎么解决这个问题啊,哎,没错,我们前面是不是讲了一个这个条件是吧,Begin是吧,只要写清楚begin,那是不是就是在读取之前先执行条件,先执行这个动作对吧?那这个时候看着前面加begin,注意大写啊。
06:12
啊,这然后回车这个时候看就可以正确路线,哎,那也就说你记住了啊,如果需要你手工指定分割符,在这个分割符动作之前一定要加PB,别忘了这个事儿啊,要不然就会出前第一行处理不了的情况,好,那这是手工定分割符啊,当然我说啊,如果你没有其他的处理条件,那么这么指定。肯定如果只是截取基金链,那肯定看是截取更方便,对吧,但是呢,比如说我想要做一个更复杂一点的,比如说。我想要判断一下你的这个东西,比如说我要必须是什么,我指定分隔符,但是我只打印某一个用户。哎,我的用户是谁,我这里有个判断,那cut是不是就做不了了,对吧,那这种情况下,比如说看着我begin。
07:00
第一个条件是begin开始直线分隔符,第二个条件打印,打印谁呢?那我这样,我我我进一下,比如说打印ucg,打印UIG是500的这个用户,那我们就可以干嘛,到了这个第三列对吧,等于注意啊,我再说一下,判断两个字符串是否相等,都是用双等号。不要用单等号,因为单等号是负值啊,那所以我们说包了第三列是500,那如果是把它的用户给打出来,哎,那这种情况下看USC打出来,那如果有这样的条件,多余条件的时候,卡就做不了了。Cut是不是就不行了,Cut要做是不是就得写桥本,写程序,你现在把这个UID截出来,然后写程序,判断一下它是不是500,是把他的这个用户名打出来,不是就放弃,或者是这个就继续读下一个。那这样写一个循环呢,对吧,怎么也得十几号这个代码,而这里呢,看简单了吧,我们说各位aw k啊,在特定读取特定数据的时候,它的这些方法是要远比你自己写程序要方便,当然啊,缺点在于这个格式真不好背,别说你我有时候我我现在我经常背不清楚这个括号,这个这个就是引号。
08:13
这个引号到底引在哪?我们这个真的是太不后备了,所以有些时候我们还是建议啊,如果你真的aw k这玩意儿你记不下来,你还就你就麻烦点写个程序来判断,我觉得也行,程序最少什么好理解啊,我们自己写的东西,程序写出来之其实更比aw k这个好理解,最少好背。其次我再说我们事儿是不需要考虑效率的,你就看起来写得笨没关系,能实现功能就行,OK,但是理论上说,在AA wa当中,如果你需要指读取指定行,指定的数据,指定的列,用AWK要远比自己写程序方便的多,OK啊,好,那如果是这种情况下,我们就说那它。这个肯定要cut就解,解决不了,那我们就必须用aw k来做这个提取啊,当然如果再说如果你就是简单的提取链,这个肯定还是看得见的,对吧?好了,这是指定分隔符,OK,接下来我们来看看这个看啊这个格式老烦老烦了,我们看这块首先指定分割符。
09:19
打印到了一。这个是换这个推不进对吧,打印到了三也是打,也就是说打印用户名和ID号,然后呢,这个换行看清楚,双引号在这。双引号在这儿,为什么?这个是它的这个识别,就是print里面识别的这种换行符,这个特殊格式需要用双引号括起来,如果这只是普通字符串,要想输出也得用一块过去。哎,我们一开始讲的时候,你还记得吧。我们一开始讲普通的F的时候,哪去了?我们一开始讲普纳F的时候,你的输出内容是不是都是需要把它括起来的?对吧,所以啊,这里也一样啊。
10:02
所以啊,这里也一样啊,如果你需要这里输的只是一个普通字符串,那么它是需要什么,把这个引号括起来,所以啊,这个引号在这儿你看清楚啊。OK,那也就是说我只是想输入一下行号,就是打印一行,打印一下这个字符串,我标能标清楚,我这是第几行,OK,然后后面NR是变量,需要在双引号之外看清楚啊,双引号,这是双引号。哎,后面这是双引号看见了NR和NF这些变量需要在双引号之外看到了,所以我说特别容易记混,我们一般写程序都是把变量用双引号括起来,字符串和双引号括在一起都能识别,但是这里是把字符串和换行符这样的符号要用双引号括起来,变量是需要放在双引号之外了,大家小心这个事儿。那也就是说这里的意思是我想打印一下我当前处理的就输出DO1的,DO3的这一行是第几行,NR是输出它的行号。
11:05
就是行号所在行的行号,然后呢字段数,它这里统计了这个字段数。这个NF里统计的是当前文档总共有多少列,总数是多少,所以你看。我虽然统计出来的是两行对吧,就是不同的行,这是第一行,这是第二行,呃,但那但是它的列数是一样的,总数只有这个七列看到了,那这个时候看啊,那我们试一下。啊,这个。把这个先去掉,我不不再犯犯这个了,我就想打印,打印一下什么呢,我先干嘛。啊,我先反斜放器加个制表符,把它隔开用户名,打印用户名,然后打印NR,它是第几行啊,不是打印这个,把NR变量是不是要写在外面啊,要写在这个括号外面。我也别加什么行号了,我就知道不加这个字符串了,不加这个行号了,我就知道我要打印它是第几行,然后打印自段总数就行了,然后行了双引号加反斜放器,然后呢,N这个F,那我们知道一下行号和自段数,那我们可以看啊,我这里啊,小心啊。
12:18
我是先读了一下文件。然后把其他的伪用户给排除在外了,所以我传给aw k的总共就这三行。就这三行,所以啊,这里打印出来就应该是1233行,所以可以看一下这个行号是123,哎,有人说password里这个绝不是,这个绝不是第二行,后面就绝不是第三行,那是由于gra把其他多余数据去掉。那如果没有这一行,比如说看这啊。我们。把它去掉。那这个里边读出来的就是所有文件对吧,那这个时候我们就能看到什么,哎,我的U31是U320,第29行和30行看到了啊前面之所以读数是123,因为是把其他的用户给过滤掉了,我传给aw k的总共只有这三行数据,OK,好了各位。
13:10
这两个变量还是没有用的,就是读取你当前的行号和当前数据的这个总的列数,这个还是有用,那其实它的内置变量,其实常见的就是前面这些后面这些啊,其实说心里话,用它用aw k写,我觉得还真不如用这个这个这个这个这个呃事程序来写,可能还更好理解一点,所以啊,我们就把前面这个一定要用,我们说一下就行了,好了各位。这节课呢,我们就到这里,我们这节课讲了一下aw k的内置变量,前面两个我们见过,后面这个,尤其是这个指定分割符,这个事儿是一定要用的,记得这个加begin这个条件。好,各位,那这节课就是这样,我们下节课再见。
我来说两句