我们都知道awk是专门为文本处理设计的编程语言,也是一个应用程序,几乎所有Linux发行版本都自带这个程序。我们通常用它进行数据扫描、过滤、统计汇总工作。本文只介绍awk的命令行用法,对于大多数场合,应该足够用了。
awk基本语法
awk 命令的基本格式如下:
awk ‘条件1 {动作 1} 条件 2 {动作 2} …’ 文件名
awk语法由一系列条件和动作组成,在花括号内可以多个动作,在多个动作之间是有分号分隔,在多个条件和动作之间可以有若干空格,也可以没有。
内置变量
$0 | 当前记录(作为单个变量) |
---|---|
FS | 输入字段分隔符 默认是空格 |
NF | 当前记录中的字段个数,就是有多少列 |
$1~ $n | 当前记录的第n个字段,字段间由FS分隔 |
NR | 已经读出的记录数,就是行号,从1开始 |
RS | 输入的记录他隔符默 认为换行符 |
OFS | 输出字段分隔符 默认也是空格 |
ORS | 输出的记录分隔符,默认为换行符 |
FNR | 当前记录数 |
OFMT | 数字的输出格式 %.6g |
ARGC | 命令行参数个数 |
ARGV |
基本用法
我们先来学习 awk 的基本用法,也就是只看看格式化输出动作是干什么的。
在终端上输入 free
查看内存
print的简单使用
那如果我们打印第三列的话,可以使用free | awk '{print $3}'
可以看到free输出三行内容,awk是逐行处理工具。如果匹配成功则执行print $3 这个动作。有些朋友会问,print $3 这个动作这个动作只写一次,为什么执行多次呢?awk隐藏了循环,条件匹配多次,动作就会被执行多少次。
打印文本内容
text.txt
hello world
this is test
C C++ python go
输出行号 NR
awk内置变量NR为当前的行号,当awk隐含free命令输出的第1行时执行print NR后屏幕输出当前行号1。依次读取下去。
打印当前行行号
为什么输出行为4,原因是有换行。
输出每行数据的列数 NF
awk内置变量NF为当前行的字段列数,例如 free | awk '{print NF}'
打印每行的列数
(NF-1)代表倒数第二个字段。
自定义变量
awk 可以通过 -v 选项设置或者修改变量,我们可以使用-v定义新的变量,也可以使用该选项修改内置变量的值
定义变量,输出变量。
因为自定义数据行字段的分隔符属于经常使用的功能,为了方便自定义字段分隔符,awk程序还替换了一个-F选项,可以直接指定数据字段的分隔符。
test.txt
hello: world
this: is: test
C: C++: python: go
定义冒号为字段分隔符
text.txt
hello world
this is test
C C++ python go
默认字段分隔符为空格
定义字段分隔符为冒号
内置变量OFS保存的是输出字段的分隔符,默认空格,而ORS保存的是输出记录的分隔符,默认为换行符\n。
print指令
使用print指令输出特定数据时,我们可以输出变量的数据,同时也还可以直接输出变量,如果是字符串常量需要使用双引号括起来,如果是数字常量则可以直接打印。
条件匹配
下面开始编写条件匹配案例,awk支持使用正则进行模糊匹配,也支持字符串和数字的精确匹配。还支持逻辑与和逻辑或。
text.txt
hello world
this is test
C C++ python go
在两个数据之间进行正则匹配需要使用正则比较符(~)进行匹配比较
查看head -2 /etc/passwd
文件内容,匹配第三列小于10的行。
上面的这条命令逐行精准匹配 /etc/passwd文件的第三行,如果第三行的数组小于10,则打印该行所有数据的内容。
仅显示第四行数据内容
满足两个条件,逻辑与
满足两个条件,逻辑或
查看当前登录信息
查看文件系统信息
上面的命令先通过文件系统信息,使用tail -n + 2可以从第2行开始显示文件系统信息,这样就可以把不包含的数据的标题行去除,awk每读取一行数据就执行一次 sum+=$4,sum变量没有初始化定义,因此初始化值为0,而df输出的每行第四列为剩余容量。
总结
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。
本篇快速了解awk相关知识点,相对比较粗糙,我是参考awk的man手册以及Linux Shell 核心编程指南总结而成的,相信本篇文章可以让大家对awk有一个大致的了解,欢迎大家一起交流。
参考:Linux Shell 核心编程指南
欢迎关注公众号【程序猿编码】,添加本人微信号(17865354792),回复:领取学习资料。或者回复:进入技术交流群。网盘资料有如下: