怎样在字段上加上非0判断_号称Linux三剑客老大,抵得上一门语言,这个指令到底牛在哪

作用

awk是一个强大的文本分析工具,其主要工作原理就是将文件内容逐行读取,按照分隔符进行切片,切成多个组成部分,然后将每片保存到内建的变量中。如果指定了模式的话,根据模式匹配是否处理此行内容,若此行文本符合模式,则按照动作处理文本。

以上介绍到了几个关键词,分别是模式和动作,具体意思会放在后面介绍 。

357ac838124d3ed77fe60d36bb0549ff.png

在上面的文本中,通过分隔符将文本内容切割成多个列,那么如果想获取某个列怎么办呢 ?就可以使用$加上第几列的数量就可以。具体如下:

  • $0 : 代表所有数据
  • $1 : 代表第一列
  • $2 : 代表第二列
  • $n : 代表第n列

需要注意的是,若切割出的第n列已经没有数据,你继续输出的话就输出了空行 。

f21bf8998d410c75d3640f25dedc109e.png

awk早期就以在Unix上实现了,现在Linux上所使用的awk其实是gawk,也就是GNU awk,简称为gawk。而在Linux中所使用的是awk其实就是链接到了gawk中了。

语法

awk [options] 'Pattern {Action}' file

对以上各指令的解析:

  • awk是固定的语法,在Linux下也可以使用gawk代替
  • 其中options为选项,在awk中支持的选项介绍具体见“选项”小结
  • 其中Pattern为模式,在awk中支持的模式介绍有见“模式”小结
  • 其中Action为要执行的命令,在awk中支持action介绍见"动作"小结
  • file为文本文件,需要注意的是awk读取的文件流不一定是要跟的这个file,也可以是通过管道输出的结果作为文件流。
04cc9994b94127c23bf8a9c2e6f739b4.png

变量

在介绍完awk的语法之后,我们有必要先了解下awk变量,因为无论是options还是Pattern,都会使用到变量。对于awk来说 ,主要包括内置变量和自定义变量两种。

  • 内置变量:变量名已经定义好了,一般情况下一会给一个默认值 ,当然我们也可以自定义变量的值 。
  • 自定义变量 : 用户自己去定义变量的名字和变量的值 。

变量的定义格式:var_name = value

内置变量

14e931fc1db2077f87aaf582566fa7e2.png

变量使用也非常简单,直接使用变量名即可,具体如下:

f0283d657bda8d1167126401c26b01a9.png

自定义变量

自定义变量,简单来说就是用户自己定义的变量。在awk中有两种方式可以自定义变量。

方式1:使用-v参数,定义格式为:-v var_name = value .

方式2:在BEGIN模式中定义 。

以上的两种方式,目前还没有涉及到,故我们在下面内容中讲解 。

注意:定义变量最终的目的是要使用变量,那么在awk中怎么使用呢 ? 答案就是使用处直接写变量的名字就可以得到变量的值了 。那么变量一般会在哪使用呢 ? 在后面要讲解到的模式和动作都会用到 。

选项

所谓的选项,就是awk后面的options,一般都是通过减号(-) 加上一个英文字符组成,不同英文字符代表不同的意思 。在awk中支持的选项参数也有很多,放在方括号内([])代表这个选项是可选的。这里主要介绍最常用的。

e5c4784109708cc99ca495a5006c4299.png
  • -F : 指明用于分割内容的分隔符,若不加该参数,默认使用空格分割
  • -v : 自定义变量,具体格式为:var_name = value .
  • -f : 调用脚本。

-F 选项

以下是对-F参数的说明,在此案例中使用英文点(.)作为分隔符,通过分隔符将文本内容分隔成多个部分。

7d6f65d133001b080155cd85e4f8b630.png

-v 选项

在上面我们介绍-v可以自定义变量,自定义变量时,变量名可以是内置变量也可以用户自己定义的变量名 ,具体定义方式如下:

5ebaf77e95618b34e23f3c2f1aa2a264.png

2)自己定义变量名进行定义

ee3fc983d39f01817948b383e41eb6a2.png

模式

3cf7a281ebaaee13796b34cfbb025b94.png

所谓的模式,其实就是Pattern的部分,我们可以将模式理解为条件,在前面介绍到awk是逐行处理的,那怎么判断哪行该处理?哪行不该处理呢 ?答案就是这个模式,当匹配到的模式就是要处理的行,而不匹配的行就会被跳过。

另外,Pattern部分一定要放在引号当中,一般使用单引号引起来。一条awk指令可以包括0个模式或多个模式 ;如果后面有Action ,中间用空格隔开 。

Pattern主要包括以下几个部分:

  • BEGIN模式:初始化代码块,即开始处理文本前要执行的操作 。
  • END模式:收尾工作,即处理文本之后要执行的操作
  • 关系表达式模式 :相当于条件判断,满足条件的就会执行后面的‘动作’,而这里就支持各种运算符,如比较运算符,算数运算符等。
  • 空模式 :此模式会匹配文本的每一行,也就是每一行满足条件 。
  • 正则模式:通过正则进行匹配,匹配后的将会执行后面的动作 。
  • 行范围模式 :处理pattern1到pattern2之间(不包含pattern2) 。从pattern1匹配的行开始,到pattern2匹配的行结束 。

BEGIN模式

在前面介绍到,BEGIN模式是在处理文本之前的动作,在声明BEGIN时,后面括号内的语句就是BEGIN要执行的操作,

1e9bf0f5e79314507d15e9deeb9696b5.png

END模式

指定了处理完文本内容之后执行的操作,也就是进行一些收尾工作 。

ea628e78be2177cf4318cf11de6b1995.png

空模式

空模式其实就是不设置任何模式或条件 ,也就是说对文本的每一行需要执行的处理就是空模式,简单来说空模式就是对行不做过滤处理,具体如下:

5a112837d7585dc95013a4b32c61ad85.png

关系表达式模式

所谓的关系表达式模式是指包含表达式的模式,通过该表达式对文本行进行过滤处理 。

  • 表达式可以是比较表达式,也可以是赋值运算符
  • 同时支持的操作符也是

以下为比较表达式

a2c3aff839359b65f70659b6283b6f48.png

awk支持的比较运算符还包括:

  • x < y : 小于
  • x <= y :小于等于
  • x > y : 大于
  • x >= y :大于等于
  • x == y : 等于
  • x != y :不等于
  • x ~ y : 匹配正则y为真
  • x !~ y : 不匹配正则y为真

以下为赋值表达式

d8ec161fb4d2e5059c5c480da373e539.png

awk支持的赋值运算符包括:

  • x = y : 赋值
  • x += y : 先加后赋值
  • x -= y : 先减后赋值
  • x *= y : 先乘后赋值
  • x /= y : 先除后赋值
  • x %= y :先取余后赋值
  • x^= y:先次方后赋值
  • x ** y : 先次方后赋值
  • x ++ :对x+1
  • x -- : 对x-1

支持的算数运算符:

  • x+y :加法
  • x-y :减法
  • x*y : 乘法
  • x/y : 除法
  • x%y :取余
  • x^y : 次方(效果和**一样)
  • x**y : 次方

支持布尔类型:

  • 非0值为true
  • 非空字符串为true
  • 其余为为false
25694d5ceabb54402cca71db336bf246.png

支持的逻辑操作符:

  • x && y: 两者都满足返回true
  • x || y :一个满足返回true
  • ! x : x若返回假,则返回true

除了以上支持的各种运算符外,awk还支持函数调用,条件语句,循环语句

正则模式

所谓的正则模式,其实就是使用正则表达式作为的模式 。所以要想使用这个模式,我们就得熟悉正则表达式,如果你还是对正则表达式不太熟悉,可参考第一章的正则表达式。

使用正则表达式也有一定的规则,具体如下:

awk '/正则表达式/{Action}' file
2fd94e4e71e710e3c18204459f324a78.png

行范围模式

行范围模式,是使用正则表达式来匹配两个关键字之间行的数据,如果这个关键字在文本中出现过多次,那么也会匹配出多次 。它的使用规则如下:

awk '/正则1/,/正则2/{Action}' file

动作

所谓的动作,就是Action 的部分,在Action部分主要包括如下几个部分。

c48e2a02bd489d9691f63f34395c0797.png

在Action中,虽然看语法写的是一个Action,但是在括号内可以有多个执行语句 ;也可以直接编写多个Action动作 。

fb4804ebc766b9c91fff99fc36e8f222.png
  • print :打印语句
  • printf :同样为打印语句,但是可以进行格式化
  • 条件语句 :可以进行条件判断
  • 循环语句 :可以进行循环.

print语句

在上面已经多次使用到,使用print语句可以输出变量值,在这里就不再赘述 。

printf语句

和print语句类似,但是比print语句更加强大,它的主要作用是可以对文本进行格式化处理,其语法格式为:

printf format,item1,item2 ...
  • format用于指定后面每个item的输出格式
  • format一般输入的是格式符+修饰符+一些字符组成的字符串(见下),同时需要用双引号引起来
  • fromat和item都需要用逗号隔开
  • printf语句不会自动换行,若要进行换行,需通过

格式符

  • %f : 显示为浮点数
  • %g,%G: 以科学数法或浮点形式显示数值
  • %s: 显示字符串
  • %u: 无符号整数
  • %%: 显示%号自身,相当于转义

修饰符

  • N : 显示宽度
  • - : 左对齐(默认为右对齐)
  • + : 显示数值符号
f543b19d94a93a8bc6b45348e49bf785.png

条件语句

如果学习过编程语言,都知道在编程语言中有if ...else语句 ,那么对于awk来说,也是支持if ... else 。在awk支持如下三种情况:

  • if(条件){执行语句1;执行语句2}
  • if(条件){执行语句1} else {执行语句2}
  • if(条件1){执行语句1} else if(条件2){执行语句2} else{执行语句3}

对于以上代码做个简单说明:

  • 第一种情况:如果条件为真,执行大括号{}内的语句
  • 第二种情况:如果条件为真,执行语句1;否则执行语句2
  • 第三种情况:如果条件1为真,执行语句1,否则如果条件2为真,执行语句2,否则,执行语句3
fbc58358540b8fc390f8429761d2af67.png

循环语句

在awk中,支持的for循环也有三种,分别是for, while,do ... while .具体如下:

# for循环语法格式1:    for(初始化;布尔表达式;自增减){        //执行代码    }# 实例    for(i=0;i<=10;i++){print i}# 说明        1.初始化变量的值    2.开始执行布尔表达式,如果为真,执行后面的打印语句    3.进行+1    4.重复执行第2,3步骤    # for循环语法格式2:    for(变量 in 数组){        //执行代码    }#实例    for(i in arrname){        print i,arrname[i]    }    # while循环语法格式    while(布尔表达式){        //执行代码    }#实例    while(i<=10){print i}# 说明        1.执行条件判断,若为真,执行后面打印语句    2.重复循环第1步骤# do ... while循环语法    do{        //执行代码    }while(条件)#实例    do{print "helloworld";i++}while(i<=3)# 说明    1.先执行打印语句,然后再自加1    2.执行条件判断,若为真,继续执行打印语句,然后再自加1,依次循环,直到条件变为假。
f521a5e6a1584ca400a167af55280fd8.png

当然除了以上的循环外,我们还可以在跳过本次循环,或者断开循环 . 分别使用的关键词为:

  • 跳过循环:continue
  • 断开循环:break
b779dab0e46d5c6471a9e55437ff071b.png

实例

以下练习主要使用abc.log文本进行练习;

[root@localhost test]# cat abc.log drwxr-xr-x.  20 root root  3360 9月  29 05:19 devdrwxr-xr-x.   3 root root    20 9月  14 03:08 docker_registrydrwxr-xr-x.   2 root root    41 9月  17 06:23 docker_studydrwxr-xr-x. 151 root root 12288 9月  29 05:20 etcdrwxr-xr-x.   3 root root    18 9月  10 06:57 homelrwxrwxrwx.   1 root root     7 9月  10 06:12 lib -> usr/liblrwxrwxrwx.   1 root root     9 9月  10 06:12 lib64 -> usr/lib64drwxr-xr-x.   2 root root     6 4月  11 2018 mediadrwxr-xr-x.   2 root root    21 9月  19 21:51 mnt
  1. 输出第一,第二列数据,中间不空格
875136244f0012cf906c34db544ba952.png
  1. 输出第1,3,5列数据,以制表符进行分割
3006a098f147a8bccd75633c98406e54.png
  1. 显示每行有多少字段
c905e7f07599acb752a7df683cd9aad5.png
  1. 将列数大于等于10的行打印出来
5dadf15b1b5999d67256804d51b13c7e.png
  1. 显示第5,第7行的数据
e2622ac861881bbbbdcfc269864f8b5b.png
  1. 打印出包含etc的行
eb9be0e893448404f483093f595b0258.png
  1. 打印出含有etc或者home的行
f73e7ba94ea3795568c0170deecb4404.png
  1. 打印输出第二列小于5的行
c9b20a4ea01c188376835358f1242301.png
  1. 打印第一列中不是以目录开头的行
d7ba8e2926eff83ad1d479aa1931b2d9.png
  1. 显示文件中第9个字段包含dev的行的第1和第9个字段
fba118e693e14208583034cad677e490.png
  1. 显示文件中第9个字段不包含dev的行的第1和第9个字段
dca9fb79bc046dc0a8c7ee3ec61650e9.png
  1. 如果第2列以两个数字结束就打印这个记录。
def89f200c84f54f704197336b44c7da.png
  1. 如果第2列等于1或者第7列小于15,则打印该行。
ea7f476f58abad0ee5f5564504a097bc.png
  1. 如果第2列大于5则打印?后面的表达式值,否则打印冒号后面的表达式值。
5641ee67e1ea33bfe2297c038f7abb55.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值