一、awk的介绍
1.1awk的简介
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具
可以在无交互的模式下实现复杂的文本操作
相较于sed常作用于一整个行的处理,awk则比较倾向于一行当中分成数个字段来处理,因为awk相当适合小型的文本数据。
之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符
1.2基本格式
awk -f | -v 脚本文件 文件1 文件.....
1.3awk常见的内置变量
FS∶ 列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
NF∶ 当前处理的行的字段个数。
NR∶ 当前处理的行的行号(序数)。
$0∶当前处理的行的整行内容。
$n∶ 当前处理行的第n个字段(第n列)。
FILENAME∶ 被处理的文件名。
RS∶ 行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是’\n’
$NF:最后一段
$(NF-1):倒数第二段
二、打印方法
awk可以将自动将多个空格压缩成一个空格
打印字符串需要加双引号
2.1基础打印
打印其中一列
打印字符串
2.2打印全部
注意:
0 和 1 放置 {} 前,能够起到限制答应的作用(默认为“1”)
0是不允许打印读入的内容,1是允许打印的内容
$0代表整行内容,awk是逐行读取处理,配合$0的效果就是打印文本所有内容
2.3打印行内容及其行号
2.4打印指定行内容
2.5奇偶行打印
2.5.1打印奇数行
先进行awk打印第一行的内容,结束后按照正常顺序打印,但是getline进行跳转,第二行不打印了,最终呈现出奇数行打印
2.5.2打印偶数行
先进行getline跳转至下一行,awk读取跳转后的整行内容,经过逐步跳转读取,形成了只显示偶数行
2.5.3奇偶行打印特殊方式--getline
getline工作过程
1.当getline左右无重定向符号(“<”)或者管道符号(“|”)时,awk首先读取的是第一行,而getline获取的是是光标跳转至下一行的内容(也就是第二行)
原因:getline运行之后awk会改变NF,NR,$0,FNR等内部变量,所以此时读取$0的行号不再为1,而是2。
注意:
FNR:awk当前读取的记录数,其变量值小于等于NR,(比如说当读取完第一个文件后,读取第二个文件,FNR是会从0开始进行,而NR不会)。因此读取两个或两个以上的文件,NR==FNR,可以 判断是不是在读取第一个文件。
2.当getline左右有管道符号或重定向符时,getline则作用定向输入文件,由于文件是刚打开,并没有被awk读入一行,而只是getline读入,所以getline返回的是文件的第一行,而不是跳转至一行输入
2.6条件判断打印
正向判断打印
判断取反打印
还可以直接进行 if 语句判断打印
2.7提取
2.7.1根据$n以及NR提取字段
提取ip地址
提取ipv6地址
2.7.2根据选项-F指定分隔符
以冒号为分隔符,提取第一位即可
2.7.3提取多列内容
以空格符分隔,逗号就是分隔符
2.7.4提取磁盘已经使用情况,并去除%
第一次以空格为分隔符提取,第二次用-F%分隔提取
2.7.5匹配以root开头的行
2.7.6匹配以bash结尾的行
2.7.7提取df里面的数字
三、awk的三元表达式
格式:awk '(条件表达式)?(A表达式或者值):(B表达式或者值)'
四、awk精准筛选
$n (><==) | 用于对比数值 |
$n~"字符串" | 代表第n个字段,包含某个字符串的作用 |
$n!~"字符串" | 代表第n个字段,不好含某个字符串的作用 |
$n=="字符串" | 代表第n个字段为某个字符串的作用 |
$n!="字符串" | 代表第n个字段不为某个字符串的作用 |
$NF | 代表最后一个字段 |
例子:
输出第七个字段包含“bash”所在行的第一个字段和最后一个字段
输出第七个字段不包含“nologin”所在行的第一个字段和最后一个字段
五、内置变量的使用
FS∶ 列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
NF∶ 当前处理的行的字段个数。
NR∶ 当前处理的行的行号(序数)。
$0∶当前处理的行的整行内容。
$n∶ 当前处理行的第n个字段(第n列)。
FILENAME∶ 被处理的文件名。
RS∶ 行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是’\n’
$NF:最后一段
$(NF-1):倒数第二段
5.1NF-当前处理的行的字段个数
5.1.1显示每行有几个字段
5.1.2打印出每行最后一个字段
5.1.3行倒数第二个字段
5.2NR:当前处理行的行号
5.2.1当前处理行的行号
5.2.2NR==n代表行号等于什么
代表取第二行第一个字段
5.2.3NR%2==0取偶数行
5.2.4NR%2==1取奇数行
5.2.5NR==1,NR==4取区间行
5.2.6取UID数值范围$n>1000
六、awk的分隔符
6.1RS指定分隔符
awk 从文件中读取资料时,将根据 RS 的定义把资料切割成许多条记录, 而 awk 一次仅读入一条记录进行处理。内置变量 RS 的预设值是"\n"。
但是也可以在使用 BEGIN 模式在操作前进行行分隔符的改变。
通过begin模式先在awk命令执行前将分隔符改为 : ,在打印其行号和每一行内容
6.2指定输出的分隔符
6.2.1FS 输入时的列分隔符
6.3awk结合数组运用
6.3.1awk中定义数组打印
变量i读取数组a的下标,可以形成遍历:
6.3.2去重打印数组
七、关系表达式
关系表达式结果为“真”才会被处理
真:结果为非0值,非空字符串
假:结果为空字符串或0值
n=0,第一行为假,不打印
取反
关系表达式打印奇偶数
八、awk脚本
用awk编写脚本