linuxshell编程_linux shell脚本之awk利器

我们都知道awk是专门为文本处理设计的编程语言,也是一个应用程序,几乎所有Linux发行版本都自带这个程序。我们通常用它进行数据扫描、过滤、统计汇总工作。本文只介绍awk的命令行用法,对于大多数场合,应该足够用了。

awk基本语法

awk 命令的基本格式如下:

awk ‘条件1 {动作 1} 条件 2 {动作 2} …’ 文件名

awk语法由一系列条件和动作组成,在花括号内可以多个动作,在多个动作之间是有分号分隔,在多个条件和动作之间可以有若干空格,也可以没有。

内置变量

linuxshell编程_linux shell脚本之awk利器_第1张图片

基本用法

我们先来学习 awk 的基本用法,也就是只看看格式化输出动作是干什么的。

在终端上输入 free 查看内存

95f667af5a8fee16c57b3a56281b25de.png

print的简单使用

那如果我们打印第三列的话,可以使用free | awk '{print $3}'

8a3f3383fe20f2d09df3f82e60bf108c.png

可以看到free输出三行内容,awk是逐行处理工具。如果匹配成功则执行print $3 这个动作。有些朋友会问,print $3 这个动作这个动作只写一次,为什么执行多次呢?awk隐藏了循环,条件匹配多次,动作就会被执行多少次。

打印文本内容

text.txt

hello world
this is test
C C++ python go

1ae354311d6439e89660b7b93857f598.png

输出行号 NR

awk内置变量NR为当前的行号,当awk隐含free命令输出的第1行时执行print NR后屏幕输出当前行号1。依次读取下去。

21dac31f9271c959fc666263f5890b2b.png

打印当前行行号

1d16e8ddedf4edd5cbb00aec1d00ed05.png

为什么输出行为4,原因是有换行。

b4749ad074a65570bac8f4f66a8ee421.png

输出每行数据的列数 NF

awk内置变量NF为当前行的字段列数,例如 free | awk '{print NF}'

87302174d4d87813034ab0ac4c0ae436.png

打印每行的列数

04fe946481e5f8dc82646862c575bbfc.png

(NF-1)代表倒数第二个字段。

自定义变量

awk 可以通过 -v 选项设置或者修改变量,我们可以使用-v定义新的变量,也可以使用该选项修改内置变量的值

定义变量,输出变量。

c77def7f152d69274bff5ca9b219c3f0.png

因为自定义数据行字段的分隔符属于经常使用的功能,为了方便自定义字段分隔符,awk程序还替换了一个-F选项,可以直接指定数据字段的分隔符。

test.txt

hello: world
this: is: test
C: C++: python: go

定义冒号为字段分隔符

ecbb97b5268c37652015d132a14fac35.png

text.txt

hello  world
this is test
C  C++ python go

默认字段分隔符为空格

6c3c1bd83ba54f4af874968977ddbe52.png

定义字段分隔符为冒号

01103945e79d6e685ed877ed5b7cb74e.png

内置变量OFS保存的是输出字段的分隔符,默认空格,而ORS保存的是输出记录的分隔符,默认为换行符\n。

print指令

使用print指令输出特定数据时,我们可以输出变量的数据,同时也还可以直接输出变量,如果是字符串常量需要使用双引号括起来,如果是数字常量则可以直接打印。

b65f10ade94b54f0acb9f4133497b638.png

d0cfa421aec8a7fdec7d1bfc0417a4b7.png

条件匹配

下面开始编写条件匹配案例,awk支持使用正则进行模糊匹配,也支持字符串和数字的精确匹配。还支持逻辑与和逻辑或。

text.txt

hello  world
this is test
C  C++ python go

9d5015142fde13a92983fa3a6af10563.png

在两个数据之间进行正则匹配需要使用正则比较符(~)进行匹配比较

0c1c92174e85e7798e331c3ce434114d.png

查看head -2 /etc/passwd 文件内容,匹配第三列小于10的行。

linuxshell编程_linux shell脚本之awk利器_第2张图片

上面的这条命令逐行精准匹配 /etc/passwd文件的第三行,如果第三行的数组小于10,则打印该行所有数据的内容。

linuxshell编程_linux shell脚本之awk利器_第3张图片

仅显示第四行数据内容

dabbbfb0387cc20dcd0400430d3158ea.png

满足两个条件,逻辑与

9862f9d7c989f5c2846bfa8861427581.png

满足两个条件,逻辑或

0d87225b273acdb9c638befc1d56e6f3.png

查看当前登录信息

linuxshell编程_linux shell脚本之awk利器_第4张图片

查看文件系统信息

linuxshell编程_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下使用md5sum计算和检验MD5码

Linux下抓包神器 tcpdump 使用介绍

Linux中是如何删除特殊名称文件

快速了解Linux上gcc编译器

Linux如何查看文件打开情况

linux C 命令行参数之getopt()函数的使用

不能“疏漏”的性能问题(memset)之ltrace调试

GCC编译过程(预处理->编译->汇编->链接)

linuxshell编程_linux shell脚本之awk利器_第6张图片

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

linuxshell编程_linux shell脚本之awk利器_第7张图片

写留言

你可能感兴趣的:(linuxshell编程)