Linux三剑客--awk

内容来自:
https://www.cnblogs.com/zeq912/p/9519794.html#auto_id_15

linux三剑客-awk
分类: linux三剑客
undefined
第1章 awk指哪打哪
1.1 awk内置变量
FS

输入字段(列)分隔符

-F :

相当于-vFS :

NR

number of record 行号(记录号)

NF

number of filed 每行有多少列

OFS

output 输出分隔符

RS

record separator 记录分隔符每一的结束标记 默认是回车

IGNORECASE

是否忽略大小写 1为忽略

1.1.1 RS 记录分隔符 每一的结束标记默认是回车
[root@zeq files]# cat passwd.txt

root❌0:0:root:/root:/bin/bash

bin❌1:1:bin:/bin:/sbin/nologin 默认结束标记是回车,现在文件内容为两行
以/作为记录分隔符,显示行号和文件内容

[root@zeq files]# awk -vRS="/" '{print NR,$0}' passwd.txt NR是显示行号 $0是显示一整行的内容

1 root❌0:0:root:
2 root:
3 bin
4 bash
bin❌1:1:bin:
5 bin:
6 sbin
7 nologin 现在以/为记录分隔符就变成了7行

这里的awk -vRS="/" -v给变量赋值,RS是awk内置变量,设置/为记录分隔符
1.2 awk中表示行和列
NR==1

第一行

$1

第一列

$NF

最后一列

$NF-1

倒数第二列

1.3 awk模式匹配(条件)
模式-pattern 帮助你找到想要的行

1)正则表达式

2)比较

  >

  <

  ==

3)范围

4)BEGIN{} END{}

1.4 正则表达式
~

某一列中包含xxx

!~

某一列中不包含xxx

^

以....开头的字符(列)

$

以....什么结尾的

.*

所有

^$

空行

\

转义字符 backslash 脱掉马甲打回原形

[]

匹配[]的每一个字符

一个字符出现1次或1次以上

|

或者

()

反向引用,一个整体,保护里面的内容

一个字符出现0次或者0次以上

{}

0{n,m} 数字0连续出现了至少n次,最多m次

?

一个字符出现0次或1次

1.4.1 awk正则表达式练习
创建环境

mkdir -p /server/files/

cat >>/server/files/reg.txt<<EOF
Zhang Dandan 41117397 :250💯175 第一列是姓氏
Zhang Xiaoyu 390320151 :155:90:201 第二列是名字
Meng Feixue 80042789 :250:60:50 第一第二列合起来就是姓名
Wu Waiwai 70271111 :250:80:75 第三列是对应的ID号码
Liu Bingbing 41117483 :250💯175 最后三列是三次捐款数量
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250💯175
EOF
1.4.2 取出第3列中以数字4开头的行
[root@zeq files]# awk '$3~/^4/' reg.txt $3 第3列 ~ 包括 ^4 以4开头

Zhang Dandan 41117397 :250💯175
Liu Bingbing 41117483 :250💯175
1.4.3 显示Xiaoyu的姓氏和ID号码
[root@zeq files]# awk ' $2~/Xiaoyu/{print $1,$3}' reg.txt

Zhang 390320151
1.4.4 显示所有以41开头的ID号码的人的全名和ID号码
[root@zeq files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt

Zhang Dandan 41117397
Liu Bingbing 41117483
awk默认动作

[root@zeq files]# awk '$3~/^41/' reg.txt

Zhang Dandan 41117397 :250💯175
Liu Bingbing 41117483 :250💯175
[root@zeq files]# awk '$3~/^41/{print }' reg.txt

Zhang Dandan 41117397 :250💯175
Liu Bingbing 41117483 :250💯175
1.4.5 显示所有ID号码最后一位数字是1或5的人的全名
方法1

[root@zeq files]# awk '$3~/[15]$/{print $1,$2}' reg.txt []匹配里面的1和5 $表示以...结尾

Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
方法2

[root@zeq files]# awk '$3~/(1|5)$/{print $1,$2}' reg.txt |或者 1或者5

Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
1.4.6 显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135
[root@zeq files]# awk -F: -vOFS=$ '/Xiaoyu/{print "$"$2,$3,$4}' reg.txt

$155$90$201 -F指定:为分隔符 -vOFS=$输出$为分隔符
1.5 awk替换
gsub awk内置函数

1.5.1 格式
gsub(/要替换的内容/,"替换成什么",替换的部分)

1.5.2 接“显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135”这一题
[root@zeq files]# awk '{gsub(/😕,"$"); print}' reg.txt 把所有的冒号替换成$

Zhang Dandan 41117397 $250$100$175
Zhang Xiaoyu 390320151 $155$90$201
Meng Feixue 80042789 $250$60$50
Wu Waiwai 70271111 $250$80$75
Liu Bingbing 41117483 $250$100$175
Wang Xiaoai 3515064655 $50$95$135
Zi Gege 1986787350 $250$168$200
Li Youjiu 918391635 $175$75$300
Lao Nanhai 918391635 $250$100$175
加上条件精确到哪一部分

[root@zeq files]# awk '$2~/Xiaoyu/{gsub(/😕,"$"); print $NF}' reg.txt $NF最后一列

$155$90$201
1.6 范围
1、从第1行到第5行内容

awk 'NR1,NR5'

2、从包含某个内容的行到包含某个内容的行

awk '/内容/,/内容/'

1.6.1 显示从第1行到第5行内容
[root@zeq files]# awk 'NR1,NR5' reg.txt

Zhang Dandan 41117397 :250💯175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250💯175
1.6.2 显示包含Xiaoyu到包含Waiwai的行
[root@zeq files]# awk '/Xiaoyu/,/Waiwai/' reg.txt

Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
1.7 比较表达式
$5>500 第五列大于500

NR>20 大于第20行的行,20行以后

=

==

!= 不等于

<=

<
1.7.1 查看磁盘信息 df -h
[root@zeq files]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda3 19G 7.8G 10G 44% /

tmpfs 491M 0 491M 0% /dev/shm

/dev/sda1 190M 61M 120M 34% /boot

/dev/sdb1 193M 1.8M 181M 1% /data
1.7.2 显示出磁盘使用率大于20%的磁盘分区名称和挂载点(错误范例)
[root@zeq files]# df -h|awk '$5>20{print $1,$NF}'

Filesystem on

/dev/sda3 /

/dev/sda1 /boot

[root@zeq files]# df -h|awk '$5>9{print $1,$NF}' 这里会默认$5>9是字符串(字母)而不是比较表达

Filesystem on
1.7.3 解决方法1 指定分隔符只保留数字部分
[root@zeq files]# df -h|awk -F"[% ]+" '$5>9{print $1,$NF}'

Filesystem on

/dev/sda3 /

/dev/sda1 /boot
想要去掉第一列Filesystem on信息

[root@zeq files]# df -h|awk 'NR>1 && $5+0>9{print $1,$NF}' 第1行以后(&&并且)

/dev/sda3 /

/dev/sda1 /boot
1.7.4 解决方法2 某一列+0
[root@zeq files]# df -h|awk '$5+0>9{print $1,$NF}' 第5列做比较,第5列加0

/dev/sda3 /

/dev/sda1 /boot
1.8 特殊模式 BEGIN{} END{}
1)awk执行的过程

  1.执行命令的参数(赋值) -F -v

 2.BEGIN{} 里面的内容 (awk还没有开始读取文件内容)

 3.读取文件内容

    判断是否满足条件(模式)

    符合 执行命令(动作)

    不符合  读取下一行直到最后一行

 4.文件内容读取完成后,开始执行END{}里面的内容

2)BEGIN{} 里面的内容会在 awk读取文件内容之前执行

    1.显示标题

    2.修改awk内置变量 创建变量

       awk 'BEGIN{OFS=:}'  相当于 awk -vOFS=:

    3.测试 计算

3)END{} awk读取完文件之后 执行

    显示计算结果

    先计算,END显示结果

1.8.1 统计passwd.txt中虚拟用户的数量
[root@zeq files]# cat passwd.txt 查看文件虚拟用户为nologin

root❌0:0:root:/root:/bin/bash

bin❌1:1:bin:/bin:/sbin/nologin

daemon❌2:2:daemon:/sbin:/sbin/nologin

adm❌3:4:adm:/var/adm:/sbin/nologin

lp❌4:7:lp:/var/spool/lpd:/sbin/nologin

sync❌5:0:sync:/sbin:/bin/sync

shutdown❌6:0:shutdown:/sbin:/sbin/shutdown

halt❌7:0:halt:/sbin:/sbin/halt

mail❌8:12:mail:/var/spool/mail:/sbin/nologin

uucp❌10:14:uucp:/var/spool/uucp:/sbin/nologin
统计数量

[root@zeq files]# awk '/nologin$/{i=i+1}END{print i}' passwd.txt i=i+1相当于i++

6
1.8.2 统计/etc/services 文件中空行的数量
[root@zeq files]# awk '/^$/{i++}END{print i}' /etc/services

16
1.9 awk动作
print

gsub 函数 (命令)

变量 计算

1.9.1 计算磁盘使用率
[root@zeq files]# df

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/sda3 19534104 8076500 10458644 44% /

tmpfs 502056 0 502056 0% /dev/shm

/dev/sda1 194241 62009 121992 34% /boot

/dev/sdb1 197209 1813 185003 1% /data
[root@zeq files]# df |awk 'NR>1{print $3/$2}'

0.413456

0

0.319237

0.00919329
1.9.2 查看内存信息 free free -h
[root@zeq files]# free

         total       used       free     shared    buffers     cached

Mem: 1004112 806016 198096 236 101452 563232

-/+ buffers/cache: 141332 862780

Swap: 786428 420 786008
1.9.3 计算系统内存的使用率
[root@zeq files]# free |awk '/Mem/{print ($3-$6-$7)/$2}'

0.140705

[root@zeq files]# free|awk 'NR==3{print $3/($3+$4)}'

0.140705
1.9.4 计算系统内存的剩余率
[root@zeq files]# free|awk 'NR==3{print $4/($3+$4)}'

0.859211
1.9.5 设置变量计算系统内存的使用率和剩余率
[root@zeq files]# free|awk 'NR==3{sum=$3+$4;print $3/sum,$4/sum}' sum为变量

0.140765 0.859235

posted @ 2019-11-18 10:35  xkxJack  阅读(182)  评论(0编辑  收藏  举报