linux文本三剑客-awk

405 阅读5分钟

前言

AWK是一种优良的文本处理工具。它不仅是Linux中也是任何环境中现有的功能最强大的数据处理引擎之一。
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。该实用工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。
相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk工具工作过程

逐行读取文本,默认以空格tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令
awk是将一行分成多个字段,然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。
在使用awk命令的过程中,可以使用逻辑操作符"&&"表示"与"、"|"表示"或"、"!"表示"非",还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。

awk命令格式

awk 选项 '模式或条件{操作}' 文件1 文件2...

awk -f 脚本文件 文件1 文件2

awk常见的可直接使用的内建变量

变量含义
FS列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
OFS输出内容的列分隔符
NF当前处理的行的字段个数。$NF代表最后一个字段
NR当前处理的行的行号(序数)
$0当前处理的行的整行内容
$n当前处理行的第n个字段(第n列)
FILENAME被处理的文件名
RS行分隔符。awk从文件中读取资料时,将根据RS的定义把资料切割成许多条记录, 而awk一次仅读入一条记录进行处理。预设值是"\n"

awk基本用法

按行输出

Snipaste_2022-09-13_20-39-13.png

Snipaste_2022-09-13_20-59-18.png

按列(字段)输出

Snipaste_2022-09-13_20-52-14.png

示例: 输出本机ip地址 Snipaste_2022-09-13_21-01-22.png

awk支持三元运算

Snipaste_2022-09-13_20-55-58.png

BEGIN模式

awk 'BEGIN {操作1}; [条件] {操作2}; END {操作3}' 文件

模式
BEGIN {操作1} awk 在读取文件之前的操作
[条件] {操作2} awk 逐行读取文件时执行的操作
END {操作3} awk 在处理完文件所有行之后执行的操作

Snipaste_2022-09-13_20-19-11.png

awk高级用法

通过管道符处理其他命令

变量RS用法 Snipaste_2022-09-14_13-55-43.png

统计行号,账户数量,过滤内存使用率,cpu空闲率,内存剩余容量等等 Snipaste_2022-09-14_14-19-41.png Snipaste_2022-09-14_14-57-55.png

OFS输出时的列分隔符;FS输入时的列分隔符 Snipaste_2022-09-14_14-40-36.png

Snipaste_2022-09-14_15-12-31.png

使用awk对数组定义

因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等

Snipaste_2022-09-14_15-34-05.png

思考以下内容使用awk命令内容如何打印 Snipaste_2022-09-14_16-07-39.png

扩展

date命令

Linux中 date 命令可以用来显示或设定系统的日期与时间。

格式

date -d "日期时间" //显示字符串所☞日期和时间
date <+时间日期格式> //☞定日期
eg:
date -d "-1day"
date -d "1day"\

时间日期格式

%%   输出字符 %
%a   星期几的缩写 (Sun..Sat)
%A   星期的完整名称(Sunday..Saturday)。 
%b   缩写的月份名称(例如,Jan)
%B   完整的月份名称(例如,January)
%c   本地日期和时间(例如,Thu Mar  3 23:05:25 2005)
%C   世纪,和%Y类似,但是省略后两位(例如,20)
%d   日 (01..31)
%D   日期,等价于%m/%d/%y
%e   一月中的一天,格式使用空格填充,等价于%_d
%F   完整的日期;等价于 %Y-%m-%d
%g   ISO 标准计数周的年份的最后两位数字
%G   ISO 标准计数周的年份,通常只对%V有用
%h   等价于 %b
%H   小时 (00..23)
%I   小时 (01..12)
%j   一年中的第几天 (001..366)
%k   小时,使用空格填充 ( 0..23); 等价于 %_H
%l   小时, 使用空格填充 ( 1..12); 等价于 %_I
%m   月份 (01..12)
%M   分钟 (00..59)
%n   新的一行,换行符
%N   纳秒 (000000000..999999999)
%p   用于表示当地的AM或PM,如果未知则为空白
%P   类似 %p, 但是是小写的
%r   本地的 12 小时制时间(例如 11:11:04 PM)
%R   24 小时制 的小时与分钟; 等价于 %H:%M
%S   秒 (00..60)
%t   插入水平制表符 tab
%T   时间; 等价于 %H:%M:%S
%u   一周中的一天 (1..7); 1 表示星期一
%U   一年中的第几周,周日作为一周的起始 (00..53)
%V   ISO 标准计数周,该方法将周一作为一周的起始 (01..53)
%w   一周中的一天(0..6),0代表星期天
%W   一年中的第几周,周一作为一周的起始(00..53)
%x   本地的日期格式(例如,12/31/99)
%X   本地的日期格式(例如,23:13:48)
%y   年份后两位数字 (00..99)
%Y   年
%Z  时区缩写 (如 EDT)

常用操作

date +%Y%m%d                   # 显示年月日
date -d "+1 day" +"%Y%m%d"       # 显示后一天的日期
date -d "-1 month" +"%Y%m%d"     # 显示上一月的日期
date -d "1 month ago" +"%Y%m%d"  # 显示上一月的日期
date -d "-1 year" +"%Y%m%d"      # 显示前一年的日期
date -d "10 second ago" +"%Y%m%d %H:%M:%S"  # 显示10秒前的时间,显示具体的时分秒

Snipaste_2022-09-14_16-41-44.png

查看系统启动时间,通过date命令计算出系统启动时间(本次系统开机时间)

Snipaste_2022-09-14_16-50-39.png