Linux三剑客——awk

作用

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

以上介绍到了几个关键词,分别是模式和动作,具体意思会放在后面介绍 。
请添加图片描述
在上面的文本中,通过分隔符将文本内容切割成多个列,那么如果想获取某个列怎么办呢 ?就可以使用$加上第几列的数量就可以。具体如下:

  • $0 : 代表所有数据
  • $1 : 代表第一列
  • $2 : 代表第二列
  • $n : 代表第n列
    需要注意的是,若切割出的第n列已经没有数据,你继续输出的话就输出了空行 。
    请添加图片描述

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,也可以是通过管道输出的结果作为文件流。

请添加图片描述

变量

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

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

变量的定义格式:var_name = value

内置变量

请添加图片描述
变量使用也非常简单,直接使用变量名即可,具体如下:
请添加图片描述

自定义变量

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

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

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

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

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

选项

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

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

-F 选项

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

-v 选项

在上面我们介绍-v可以自定义变量,自定义变量时,变量名可以是内置变量也可以用户自己定义的变量名 ,具体定义方式如下:
请添加图片描述
2)自己定义变量名进行定义
请添加图片描述

模式

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

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

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

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

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

END模式

指定了处理完文本内容之后执行的操作,也就是进行一些收尾工作
请添加图片描述

空模式

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

关系表达式模式

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

  • 表达式可以是比较表达式,也可以是赋值运算符

  • 同时支持的操作符也是
    以下为比较表达式
    请添加图片描述
    awk支持的比较运算符还包括:

  • x < y : 小于

  • x <= y :小于等于

  • x > y : 大于

  • x >= y :大于等于

  • x == y : 等于

  • x != y :不等于

  • x ~ y : 匹配正则y为真

  • x !~ y : 不匹配正则y为真

以下为赋值表达式
请添加图片描述
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
    请添加图片描述
    支持的逻辑操作符:

  • x && y: 两者都满足返回true

  • x || y :一个满足返回true

  • ! x : x若返回假,则返回true

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

正则模式

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

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

awk '/正则表达式/{Action}' file

请添加图片描述

行范围模式

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

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

动作

所谓的动作,就是Action 的部分,在Action部分主要包括如下几个部分。
请添加图片描述
在Action中,虽然看语法写的是一个Action,但是在括号内可以有多个执行语句 ;也可以直接编写多个Action动作 。
请添加图片描述

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

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

printf语句

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

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

格式符

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

修饰符

  • N : 显示宽度
  • -: 左对齐(默认为右对齐)
  • +: 显示数值符号
    请添加图片描述
条件语句

如果学习过编程语言,都知道在编程语言中有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

请添加图片描述

循环语句

在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,依次循环,直到条件变为假。

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

  • 跳过循环:continue
  • 断开循环:break
    请添加图片描述

实例

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

[root@localhost test]# cat abc.log 
drwxr-xr-x.  20 root root  3360 9月  29 05:19 dev
drwxr-xr-x.   3 root root    20 9月  14 03:08 docker_registry
drwxr-xr-x.   2 root root    41 9月  17 06:23 docker_study
drwxr-xr-x. 151 root root 12288 9月  29 05:20 etc
drwxr-xr-x.   3 root root    18 9月  10 06:57 home
lrwxrwxrwx.   1 root root     7 9月  10 06:12 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 9月  10 06:12 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 4月  11 2018 media
drwxr-xr-x.   2 root root    21 9月  19 21:51 mnt

输出第一,第二列数据,中间不空格
请添加图片描述
输出第1,3,5列数据,以制表符进行分割
请添加图片描述
显示每行有多少字段
请添加图片描述
将列数大于等于10的行打印出来请添加图片描述
显示第5,第7行的数据
请添加图片描述
打印出包含etc的行
请添加图片描述
打印出含有etc或者home的行
请添加图片描述
打印输出第二列小于5的行
请添加图片描述
打印第一列中不是以目录开头的行
请添加图片描述
显示文件中第9个字段包含dev的行的第1和第9个字段

请添加图片描述

显示文件中第9个字段不包含dev的行的第1和第9个字段
请添加图片描述
如果第2列以两个数字结束就打印这个记录。
请添加图片描述
如果第2列等于1或者第7列小于15,则打印该行。
请添加图片描述
如果第2列大于5则打印?后面的表达式值,否则打印冒号后面的表达式值。
请添加图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux三剑客指的是 awk、sed 和 grep。 awk 是一种用来处理文本文件的工具,它可以根据指定的模式进行自动分割并进行数据处理。 sed 是一种流编辑器,它可以对文本文件进行替换、删除和插入操作。 grep 是一种文本搜索工具,它可以在文本文件中搜索指定的字符串。 ### 回答2: Linux三剑客,分别是awk、sed和grep,它们是Linux系统中非常重要的命令行工具,它们通常被称为文本处理工具。这些工具通常被用于筛选、搜索和处理文本文件。 grep是一种常见的文本搜索工具,可以在文件和文件夹中搜索指定的字符串或正则表达式。grep可以搜索多个文件并返回匹配行的输出。它是处理日志文件或查找匹配模式的最佳工具之一。 sed是一种流编辑器,可以按照行处理文本文件。它可以通过替换、删除和插入操作来修改文件内容。在大型文件中查找并替换模式是sed的主要作用。该工具通常在文本文件中提取有用信息是常用。 awk是一种强大的文本操作工具,可以分析大型文本文件并对其进行处理。该工具可以遍历行和列,并提供强大的文本处理工具,如计算、过滤和转换数据。awk的处理速度非常快,适用于处理大型数据文件。 Linux三剑客awk是最强大的工具,它可以执行复杂的文本数据操作和转换,可大大简化开发和管理过程。sed主要用于简单的文本数据过滤和替换,而grep主要用于搜索文件和定位特定行。 总之,Linux三剑客在文本数据处理方面具有不可替代的重要作用。对于Linux操作系统的开发人员和管理员来说,熟练使用这些工具可以提高他们的工作效率,使他们更容易管理和操作文本文件。 ### 回答3: Linux三剑客awk sed grep是我们在日常工作中经常使用的三个命令。它们都属于文本处理工具,可以用于查找、处理、分析文本文件等。 首先,grep是最常用的文本搜索工具。grep可以用来快速查找文件中指定的字符串或正则表达式,并将包含该字符串或正则表达式的行打印出来。常用的命令有grep、egrep和fgrep。比如,我们可以使用grep命令来查找一个文件中包含指定关键字的行,可以使用egrep来支持正则表达式搜索,使用fgrep来进行快速搜索,不支持正则表达式。 其次,sed是一种流编辑器,主要用于对文本文件进行替换、删除、添加、插入等操作。sed命令可以通过管道(|)将多个命令组合起来,从而进行复杂的文本操作。sed可以快速完成对文本文件的修改操作,比如替换文件中的某些内容、删除特定的行、在文件中插入新的文本等。sed的命令形式是“command", 比如"s/old/new/g",表示将old替换成new。 最后,awk是一种强大的文本处理工具,主要用于在文本文件中查找、处理以及格式化特定的字段。和grep、sed不同的是,awk更加灵活,可以在处理过程中做到数据过滤和加工,对于大数据的处理特别有用。awk命令的常用语法是"pattern {action}"。其中,pattern代表要匹配的模式,而action代表模式匹配时需要执行的动作,我们可以在其中添加处理语句来对文件进行各种处理操作,比如计算、统计、格式化等。 综上所述,Linux三剑客awk sed grep是我们在文本处理工作中不可或缺的三个工具,不同的工具可以用于处理不同的文本操作,也可以用于搭配使用,以完成更加复杂的文本处理工作。对于需要经常处理文本的人员来说,掌握这些工具是非常必要的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值