【Shell脚本】文本三剑客之awk

目录

一.awk工作原理及对比

1.工作原理

2.awk与sed对比

二.awk格式及用法

1.命令格式

2.常见内建变量(可直接用)

3.基础用法

3.1.按行输出文本

输出所有内容

输出指定行内容

输出奇数行跟偶数行

3.2.按字符串输出文本

输出以 root 开头的行

输出以 nologin 结尾的行

​3.3.按字段输出文本

输出每行中(以空格或制表位分隔)的第3个字段

输出每行中的第1、3个字段

换行输出行号和行内容

同行输出行号和行内容

4.BEGIN打印模式

4.1.基本格式

4.2.处理过程

4.3.示例

统计以/bin/bash 结尾的行数

 修改字段分隔符

5.条件语句

5.1.格式

5.2.示例

行内容满足if的条件则执行操作

行内容是否条件表达式,如果条件成立则变量取值1,条件不成立则变量取值2

使用while循环对每行内容执行操作

三.awk结合数组

1.特性

2.

3.示例

3.1.格式

3.2.

四.awk常用筛选数据实例

1.获取本机上一次开机时间

2.检测本机CPU最近15分钟的负载

3.内存使用率

4.CPU使用率

5.磁盘分区容量使用率

6.检测入站网卡流量和出站网卡的流量


一.awk工作原理及对比

1.工作原理

  • 逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令

2.awk与sed对比

  • sed命令常用于一整行的处理
  • awk比较倾向于将一行分成多个“字段”然后再进行处理

二.awk格式及用法

1.命令格式

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

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

2.常见内建变量(可直接用)

内建变量作用
FS

列分割符

指定每行文本的字段分隔符,默认为空格或制表位

与"-F"作用相同

NF当前处理的行的字段个数
NR当前处理的行的行号(序数)
$0当前处理的行的整行内容
$n当前处理行的第n个字段(第n列)
FILENAME被处理的文件名
RS

行分隔符

awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录

而awk一次仅读入一条记录,以进行处理

预设值是'\n'

3.基础用法

3.1.按行输出文本

输出所有内容
awk '{print}' testfile2

awk '{print $0}' testfile2

输出指定行内容
awk 'NR==5,NR==8{print}' testfile2           输出第 5~8 行内容

awk '(NR>=1)&&(NR<=3){print}' testfile2      输出第 1~3 行内容
 
awk 'NR==11||NR==30{print}' testfile2        输出第 11 行跟第 30 行内容

输出奇数行跟偶数行
awk '(NR%2)==1{print}' testfile2 		     输出所有奇数行的内容
  
awk '(NR%2)==0{print}' testfile2		     输出所有偶数行的内容
 

awk '{print $0; getline}'

awk '{getline; print $0}'

3.2.按字符串输出文本

输出以 root 开头的行
awk '/^root/{print}' /etc/passwd

输出以 nologin 结尾的行
awk '/nologin$/{print}' /etc/passwd


3.3.按字段输出文本

输出每行中(以空格或制表位分隔)的第3个字段
awk -F ":" '{print $3}' /etc/passwd
输出每行中的第1、3个字段
awk -F ":" '{print $1,$3}' /etc/passwd

换行输出行号和行内容
awk -F '字段分隔符' '条件{print NR; print $0}' 文件          

awk -F '字段分隔符' '条件{print NR} 条件{print $0}' 文件
同行输出行号和行内容
awk -F '字段分隔符' '条件{print NR,$0}' 文件

4.BEGIN打印模式

4.1.基本格式

awk 'BEGIN{...};条件{...};END{...}' 文件

4.2.处理过程

  • BEGIN {...} 表示处理文件前执行的操作
  • 条件 {...}     表示对匹配满足指定条件的文件行内容执行的操作
  • END {...}     表示处理完文件所有行内容需要执行的操作

4.3.示例

统计以/bin/bash 结尾的行数
awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd

等同于

grep -c "/bin/bash$" /etc/passwd

 修改字段分隔符
echo A B C D | awk 'BEGIN{OFS=":"}; {print $0; $1=$1; print $0}'

5.条件语句

5.1.格式

awk '{控制语句条件 {操作}}' 文件

5.2.示例

行内容满足if的条件则执行操作
awk 'if(条件表达式) {操作}' 文件 

行内容是否条件表达式,如果条件成立则变量取值1,条件不成立则变量取值2
 awk '变量=条件表达式?值1:值2; {操作}' 文件 

使用while循环对每行内容执行操作
awk 'BEGIN{执行循环前的操作; while("命令" | getline) 每次循环的操作; 执行循环完后的操作}'

三.awk结合数组

1.特性

  • awk的数组是关联数组(即key/value方式的hash数据结构),索引下标可为数值(甚至是负数、小数等),也可为字符串 1. 在内部,awk数组的索引全都是字符串,即使是数值索引在使用时内部也会转换成字符串 2. awk的数组元素的顺序和元素插入时的顺序很可能是不相同的

  • awk数组支持数组的数组

2.

补充:

  • BEGIN中的命令只执行一次
  • awk数组的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号

3.示例

3.1.格式

awk '{a[1]++}END{for(i in a){print a[i]}}' 文件

补充:a[1]初始为0,a[1]++后即为1,而这里awk中的a[1]++最终的值是由test.txt文本内容有多少

行决定的,文本逐行读取完毕后再执行END中的命令

3.2.

四.awk常用筛选数据实例

1.获取本机上一次开机时间

date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y%m%d %H:%M:%S"

2.检测本机CPU最近15分钟的负载

uptime | awk '{print $NF}'


3.内存使用率

free | awk '/Mem:/{print int($3/$2*100)"%"}'

4.CPU使用率

top -b -n1 | awk -F, '/%Cpu\(s\)/{print $4}' | awk '{print 100-$1"%"}'

5.磁盘分区容量使用率

df | grep -w "/" | awk '{print $5}' | awk -F% '{print $1"%"}' 

6.检测入站网卡流量和出站网卡的流量

ifconfig ens33 | awk '/RX p/{print $5}

ifconfig ens33 | awk '/TX p/{print $5}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值