awk 初学总结

1 概念
除了使用 sed 命令,Linux 系统中还有一个功能更加强大的文本数据处理工具,就是 awk。它诞生于 20 世纪 70 年代末期,这也许是它影响了众多 Linux 用户的原因之一。
AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。awk命名: Aho、Weingberger 和 Kernighan三个人的姓的缩写。
awk也是一个数据处理工具!相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个字段来处理。
和 sed 命令类似,awk 命令也是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理。

2 awk 命令的基本格式为:
awk [-F field-separator] ‘commands’ filename
其中,[-F域分隔符]是可选的,因为awk使用空格或tab键作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项,如果要浏览诸如passwd文件,此文件各域以冒号作为分隔符,则必须指明-F选项,如:awk -F: ‘commands’ filename
commands 是awk要执行的命令动作。
filename是要处理的文件。filename可以是多于一个文件的文件列表,awk将按顺序处理列表中的每个文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格或tab键。
此命令常用的选项以及各自的含义,如表所示:
选项 含义
-F fs 指定以 fs 作为输入行的分隔符,awk 命令默认分隔符为空格或制表符。
-v var=val 在执行处理过程之前,设置一个变量 var,并给其设备初始值为 val。
awk 的强大之处在于commands,它由2部分组成,分别为匹配规则和执行命令,如下所示:
‘匹配规则{执行命令}’
awk命令的完整格式:awd [-F field-separator] ‘匹配规则{执行命令}’ filename
这里的匹配规则,和 sed 命令中的匹配规则部分作用相同,用来指定执行命令可以作用到文本内容中的具体行(匹配条件),可以使用字符串(比如 /demo/,表示查看含有demo字符串的行)或者正则表达式指定。另外需要注意的是,整个commands是用单引号(’’)括起,而其中的执行命令部分需要用大括号({})括起来。
3 匹配规则{执行命令}’
任何awk语句都是由’匹配规则{执行命令}‘组成,一个awk中可以有多个语句。匹配规则决定执行命令的执行条件。
例如上面举的例子中’/^KaTeX parse error: Expected group after '^' at position 26: …Blank line"}',/^̲/就是匹配规则,print就是执行命令,当文件中有匹配/^$/条件的行是就会执行pirnt命令。
4、 匹配规则(即执行条件):
一般使用关系表达式作为条件。这些关系表达式非常多,具体参考下表:
条件类型 条 件 说 明
awk保留字 BEGIN 在awk程序一开始,尚未读取任何数据之前执行。BEGIN 后的动作只在程序开始时执行一次
awk保留字 END 在awk程序处理完所有数据,即将结束时执行。END 后的动作只在程序结束时执行一次
关系运算符
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于。用于判断两个值是否相等。如果是给变童赋值,则使用"=”
!= 不等于
匹配表达式 ~(匹配) value ~ /regexp/ 如果value匹配/regexp/,则返回真
!~(不匹配) value !~ /regexp/ 如果value不匹配/regexp/,则返回真
正则表达式 /正则表达式/ 如果在“//”中可以写入字符,则也可以支持正则表达式,如:/root/表示匹配含有root的行。
逻辑运算符
&& 逻辑与
|| 逻辑或

5 awk 使用数据字段变量
前面说过,在 awk 中,默认的字段分隔符是任意的空白字符(例如空格或制表符)。 在文本行中,每个数据字段都是通过字段分隔符划分的(-F选项指定的分隔符)。awk 在读取一行文本时,会用预定义的字段分隔符划分每个数据字段。如/etc/passwd文件中可以将“:”当做字段分隔符,共划分成7个数据字段。
awk 的主要特性之一是其处理文本文件中数据的能力,它会自动给一行中的每个数据字段分配一个变量。
默认情况下,awk 会将如下变量分配给它在文本行中发现的数据字段:
$0 代表整个文本行;
$1 代表文本行中的第 1 个数据字段;
$2 代表文本行中的第 2 个数据字段;
$n 代表文本行中的第 n 个数据字段。
6 执行命令(动作action):
awk的执行命令在大括号{ }内指明。动作大多数用来打印(即print指令),但是还有些更长的代码诸如i f和循环语句及循环退出结构。如果不指明采取动作,awk将打印出所有浏览出来的记录。
动作(Action):
格式化输出(print);
流程控制语句(if、while、for等);
7 awk中的BEGIN和END
语法:
awk [options] ‘BEGIN{ print “start” } 匹配规则{ commands } END{ print “end” }’ filename
其中:BEGIN END是AWK的关键字,因此必须大写;这两个部分开始块和结束块是可选的
BEGIN模块:BEGIN 的执行时机是"在 awk 程序一开始,尚未读取任何数据之前"。一旦BEGIN后的动作执行一次,当awk开始从文件中读入数据时,BEGIN 的条件就不再成立,所以BEGIN定义的动作只能被执行一次。通过BEGIN开始块我们可以用来设置变量,设置标题。

END模块:END也是awk的保留字,不过刚好和 BEGIN 相反。END 是在 awk 程序处理完所有数据,即将结束时执行的。END 后的动作只在程序结束时执行一次。
1.1.8、 AWK工作过程:

在这里插入图片描述

通过上面我们可以知道;AWK它工作过程
1.如果BEGIN块存在,awk执行它指定的actions。
2.awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取),awk将读入的记录分割成多个字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。
3、把当前输入记录与awk中’匹配规则{执行命令}'中的“匹配规则”比较,看是否匹配,如果相匹配,就执行对应的‘执行命令’。如果不匹配,就跳过对应的执行命令。
4、awk读取输入的下一行,继续重复步骤2和3,这个过程一直持续,直到awk读取到文件尾。
5、当awk读完所有的输入行后,如果存在END,就执行相应的actions。
二 变量

  1. awk自定义变量
    自定义变量:用户自己定义的变量,有两种形式
    1 -v varname=value 变量名区分字符大小写
    2 在program中直接定义,以下定义了3个自定义变量,其实形式像编程语言一样,定义的时候用分号。打印变量跟之前一样,用逗号隔开,注意,不需要用美元符号。
    3 也可以引用命令行定义的变量
    注:之前的{}里都是只有一个print语句,其实print只是一个语句,而{}可以有多个语句,以;号隔开。
  2. awk内置变量(预定义变量)
    awk除了可以自定义变量外,awk还提供一些内置量,常用的内置标量如下:
    $n 当前记录(当前行)的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段
    $0 这个变量包含执行过程中当前行的文本内容
    FILENAME 当前输入文件的名
    FS 字段分隔符(默认是任何空格)
    NF 表示字段数,在执行过程中对应于当前的字段数
    NR 表示记录数,在执行过程中对应于当前的行号
    FNR 各文件分别计数的行号

三 awk控制语句

  1. if语句
    if (条件)print
    if(条件){print}else{print}
    if(条件){print}else if(条件){print}else{print}
    说明: -F"[ %]+"表示将空格或%当做分隔符。
    if语句使用的地方===》对awk来说,要对取得的整行或某个字段做条件判断

  2. while循环
    语句:while(条件){语句} 如果条件为“真”进入循环,条件为“假”退出循环
    在进行运算结果统计时,可以使用符号+=,意思是说我们可以把增加的结果赋值给符号的左边的变量,对哪个域操作就把哪个域写在符号的右边,如Total+=$3
    说明:while语句使用的地方===》在awk中对一行内容中的多个字段一个个处理。

  3. for循环
    语法:for(变量赋值;条件;迭代){命令}
    特殊作用:它能够用来遍历数组中的元素
    语法:for (var in array){语句}

  4. 偶数(next)
    打印奇数或偶数行

  5. 数组
    定义:数组是一个包含一系列元素的集合。
    格式如下:
    abc[1]=”xiaohong”
    abc[2]=”xiaolan”
    解释:
    abc :为数组名称
    [1]、[2]:为数组元素下标,可以理解为数组的第1个元素、数组的第2个元素
    ”xiaohong”、”xiaolan”: 元素内容
    组变量赋值的格式

  6. var[index]=element
    说明:var====>是数组名
    index===>是关联数组的下标
    element===>是数组的元素值
    数字做数组下标:
    array[1]=”sun”
    array[2]=”kai”
    字符串做数组下标:
    array[“first”]=”www”
    array[“last”]=”name”
    我们在引用数组变量的时候,必须要包含它的下标值,然后通过下标值来提取它相对应的元素值

  7. 遍历数组中的元素
    若要遍历数组中的每个元素,可以使用for循环:
    for(var in array){print array[var]}
    说明: for循环在每次循环时会将数组array的一个下标值赋给变量var,然后去执行大括号中的语句。还有一个需要注意的地方就是这个变量var中存储的是下标值而不是数组的元素值。我们可以把这个变量当作是数组的下标,然后来提取出对应元素值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值