引言
一、概述
- AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
- 它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作
- 数据可以来自标准输入也可以是管道或文件
- 20世纪70年代诞生于贝尔实验室,现在centos7用的是gawk。
之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
二、awk工作原理
- 逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
- sed命令常用于一整行的处理,而awk比较、倾向于将一行分成多个""字段"然后再进行处理。
- awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。
- 在使用awk命令的过程中,可以使用逻辑操作符"
&&“表示"与”、“||表示"或”、"!“表示非”;还可以进行简单的数学运算,如+、一、*、/、%、^分别表示加、减、乘、除、取余和乘方。
命令格式
awk 选项 '模式或条件 {编辑指令}' 文件 1 文件 2 …
awk -f 脚本文件 文件 1 文件 2 …
格式:awk关键字 选项 命令部分 '{xxxx}' 文件名
三、常见的内建变量
参数 | 含义 |
---|---|
FS | 指定每行文本的字段分隔符,默认为空格或制表位 |
NF | 当前处理的行的字段个数 |
NR | 当前处理的行的行号(序数) |
$0 | 当前处理的行的整行内容 |
$n | 当前处理行的第 n 个字段(第 n 列) |
FILENAME | 被处理的文件名 |
RS | 行分隔符 |
awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是’\n’
简说:数据记录分隔,默认为\n,即每行为一条记录。
四、awk常用内置变量
命令 | 含义 |
---|---|
$1 | 代表第一列 |
$2 | 代表第二列以此类推 |
$0 | 代表整行 |
NF | 一行的列数 |
NR | 行数 |
1.打印包含root的整行内容
2.打印包含root的行的第一列和第六列
3.显示root那一行的总列数
4.以:/为分割,打印包含root的行数
5.打印总行数
6.显示行号和每行的内容
7 打印有几行几列
8.查看本机ip、字节数、内存
9.打印文件最后一行
10.打印第二行
awk 'NR==2' /etc/passwd
awk 'NR==2{print}' /etc/passwd
两种是一样的效果,不加print也一样,默认就是打印
- 逐行执行开始之前执行什么任务,结束之后再执行什么任务,用BEGIN、END
- BEGIN一般用来做初始化操作,仅在读取数据记录之前执行一次
- END一般用来做汇总操作,仅在读取完数据记录之后执行一次
五、awk的运算
1.案例:
2.模糊匹配
用~表示包含,!~表示不包含
3.数值与字符串的比较
比较符号:== != <= >= < >
(1)打印第五行内容
(2)打印行数 小于5行的内容
(3)打印出第三列等于0的行
(4)精确匹配一定是root的行
(5)打印出第三列大于等于1000的行
4.逻辑运算 && ||
(1)满足第3列小于10 或大于等于1000的行
(2)查看第三列大于10且小于等于1000的行
(3)打印出行号大于4且小于12的行
(4)打印出1~200之间所有能被7整除并且包含数字7的整数数字
六、其他内置变量
变量名 | 含义 |
---|---|
FS | 输入字段的分隔符 默认是空格 |
OFS | 输出字段的分隔符 默认也是空格 |
FNR | 读取文件的记录数(行号),从1开始,新的文件重新重1开始计数 |
RS | 输入行分隔符 默认为换行符 |
ORS | 输出行分隔符 默认也是为换行符 |
1.在打印之前定义字段分隔符为冒号
2.OFS定义了输出时以什么分隔
3.FNR的行号在追加当有多个文件时
[root@localhost ~]# awk '{print FNR,$0}' /etc/resolv.conf /etc/hosts //可以看出FNR的行号在追加当有多个文件时
1
2 nameserver 114.114.114.114
3 search localdomain
1 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
2 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost ~]# awk '{print NR,$0}' /etc/resolv.conf /etc/hosts
1
2 nameserver 114.114.114.114
3 search localdomain
4 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
5 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
4.RS:指定以什么为换行符,这里指定是冒号,你指定的肯定是原文里存在的字符
5.把多行合并成一行输出
1.awk高级用法
(1)定义引用变量
[root@localhost ~]# a=100
[root@localhost ~]# awk -v b="$a" 'BEGIN{print b}' //将系统的变量a,在awk里赋值为变量b,然后调用变量b
100
[root@localhost ~]# awk 'BEGIN{print "'$a'"}' //直接调用的话需要先用双引号再用单引号
100
(2)调用函数getline,读取一行数据的时候并不是得到当前行而是当前行的下一行
(3)显示奇偶数行
七、if语句:awk的if语句也分为单分支、双分支和多分支
单分支为if(){}
双分支为if(){}else{}
多分支为if(){}else if(){}else{}
[root@localhost ~]# awk -F: '{if($3<10){print $0}}' /etc/passwd //第三列小于10的打印整行
[root@localhost ~]# awk -F: '{if($3<10){print $3}else{print $1}}' /etc/passwd //第三列小于10的打印第三列,否则打印第一列
八、总结
以上就是awk全部内容啦,我们下次再见啦