linux shell脚本之awk利器

我们都知道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}'

在这里插入图片描述

打印每行的列数

linux shell脚本之awk利器_第1张图片
(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的行。

linux shell脚本之awk利器_第2张图片
上面的这条命令逐行精准匹配 /etc/passwd文件的第三行,如果第三行的数组小于10,则打印该行所有数据的内容。

linux shell脚本之awk利器_第3张图片

仅显示第四行数据内容

在这里插入图片描述

满足两个条件,逻辑与

在这里插入图片描述

满足两个条件,逻辑或

在这里插入图片描述

查看当前登录信息

linux shell脚本之awk利器_第4张图片

查看文件系统信息

linux shell脚本之awk利器_第5张图片
上面的命令先通过文件系统信息,使用tail -n + 2可以从第2行开始显示文件系统信息,这样就可以把不包含的数据的标题行去除,awk每读取一行数据就执行一次 sum+=$4,sum变量没有初始化定义,因此初始化值为0,而df输出的每行第四列为剩余容量。

总结

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。

本篇快速了解awk相关知识点,相对比较粗糙,我是参考awk的man手册以及Linux Shell 核心编程指南总结而成的,相信本篇文章可以让大家对awk有一个大致的了解,欢迎大家一起交流。

参考:Linux Shell 核心编程指南

linux shell脚本之awk利器_第6张图片

欢迎关注公众号【程序猿编码】,添加本人微信号(17865354792),回复:领取学习资料。或者回复:进入技术交流群。网盘资料有如下:

linux shell脚本之awk利器_第7张图片

你可能感兴趣的:(Linux,shell)