01.awk
awk:编程语言 GNU/awk
作用:1.取行2.取列3.模糊过滤4.数据统计,数据运算5.支持for循环 if判断 数组……6.格式化输出 sed后向引用
语法结构:awk '模式' file # 模式是找谁 指定行 指定列 模糊查找 不加任何动作awk '模式(print)' file #模式+动作其他命令输出| awk ‘模式’
案例1awk按行查找
语法结构
awk 'NR==3' file #awk输出指定的行
awk内置变量
NR存放着文件中每行的行号
== 等于
> 大于第几行
< 小于第几行
>= 大于等于几行
<= 小于等于几行
!= 不等于
&& 并且
|| 或者
创造实验环境
[root@haha1 ~]# cat a.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
只显示文件的第三行
[root@haha1 ~]# awk 'NR==3' a.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
为什么要加两个等号?
一个等号在系统中称为定义变量
只显示文件中小于3的行
[root@haha1 ~]# awk 'NR<3' a.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
只显示文件中大于3的行
[root@haha1 ~]# awk 'NR>3' a.txt
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
不取第三行
[root@haha1 ~]# awk 'NR!=3' a.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
并且和或者
&& :并且
查找大于第二行 并且小于5的行
[root@haha1 ~]# awk 'NR>2&&NR<5' a.txt
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
||:或者
案例:查找小于第2行,或者大于第5行
[root@haha1 ~]# awk 'NR<2||NR>5' a.txt
1 root:x:0:0:root:/root:/bin/bash
案例2.模糊过滤文件内容
语法结构grep '' 文件sed -n '/内容/p' 文件awk '//,//' 文件awk '/内容/' 文件
案例1.查找有root的行
[root@haha1 ~]# awk '/root/' a.txt
1 root:x:0:0:root:/root:/bin/bash
案例2.查找以1开头的行
[root@haha1 ~]# awk '/^1/' a.txt
1 root:x:0:0:root:/root:/bin/bash
案例3.查找以n结尾的行
[root@haha1 ~]# awk '/n$/' a.txt
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
案例4.查找有1,2,3的行
[root@haha1 ~]# awk '/[1-3]/' a.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin案例5.区间范围 工作中取时间范围较多
[root@haha1 ~]# awk '/^2/,/4/' a.txt
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
注意:三剑客支持扩展正则的写法grep -e 或者 egrepsed -rawk 什么都不加
案例3.awk取列
语法: awk '{print $n}' file
$0 awk的内置变量里面存放着每一行的内容
$1 表示第一列 默认以空格和tab键为分隔符 如果文件中没有空格和tab
$2 表示第二列
, 逗号 内置变量,表示空格
NF表示最后一列的列号
$NF 表示最后一列的内容注意: 所有的字符串在awk中被识别为变量,所以输出字符串必须加双引号案例1.显示文件的第一列
创造实验环境
[root@haha1 ~]# cat a.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin显示文件的第一列
[root@haha1 ~]# awk '{print $1}' a.txt
1
2
3
4
5显示文件的第二列
[root@haha1 ~]# awk '{print $2}' a.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
案例2.显示文件的第一列和第三列
[root@haha1 ~]# vim 3.txt~
~
~
~
~
~
~
~
"3.txt" [New] 14L, 219C written
[root@haha1 ~]# awk '{print $1,$3}' 3.txt [root@haha1 ~]# awk '{print $1"\t"$3}' 3.txt 案例。 先输出第3列,再输出第一列
[root@haha1 ~]# awk '{print $3"\t"$1}' 3.txt 取出最后一列的内容
[root@haha1 ~]# awk '{print NF}' 3.txt #显示最后一列的行号
3
3
3
3
3
3
3
3
3
3
3
2
3
3
[root@haha1 ~]# awk '{print $NF}' 3.txt #显示最后一行的内容
100
106
110
102
88
86
110
102
106
86
100
90
88
100案例。取出磁盘中的第五列
[root@haha1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 980M 0 980M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.5M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda3 18G 2.0G 16G 12% /
/dev/sda1 197M 110M 88M 56% /boot
tmpfs 199M 0 199M 0% /run/user/0
[root@haha1 ~]# df -h|awk '{print $5}'
Use%
0%
0%
1%
0%
12%
56%
0%
案例。取出sda3的行的方法
[root@haha1 ~]# df -h|awk '/sda3/'
/dev/sda3 18G 2.0G 16G 12% /
[root@haha1 ~]# df -h|grep "/$"
/dev/sda3 18G 2.0G 16G 12% /
[root@haha1 ~]# df -h|grep 'sda3'
/dev/sda3 18G 2.0G 16G 12% /
[root@haha1 ~]# df -h|sed -n '6p'
/dev/sda3 18G 2.0G 16G 12% /
[root@haha1 ~]# df -h|sed -n '/sda3/p'
/dev/sda3 18G 2.0G 16G 12% /
[root@haha1 ~]# df -h|awk 'NR==6'
/dev/sda3 18G 2.0G 16G 12% /
案例。取出倒数第二列
[root@haha1 ~]# df -h|awk '{print NF-1}'
6
5
5
5
5
5
5
5
[root@haha1 ~]# df -h|awk '{print $(NF-1)}'
Mounted
0%
0%
1%
0%
12%
56%
0%
取出每行倒数第二列的内容
[root@haha1 ~]# awk '{print $(NF-1)}' 3.txt
83
98
99
94
79
85
95
80
80
78
83
刘孟涛
75
最后一行为1-1=0 取$0 则输出最后一行全部内容 ($0表示全部)
[root@haha1 ~]# awk '{print $(NF-1)}' 3.txt
83
98
99
94
79
85
95
80
80
78
83
刘孟涛
75
89
wewqeawk指定分隔符:默认以tab键或空格分隔
-F
awk -F: #方法1
awk -F":" #方法2案例。取出第一列
[root@haha1 ~]# awk -F: '{print $1}' a.txt
1 root
2 bin
3 daemon
4 adm
5 lp取出最后一列
[root@haha1 ~]# awk -F: '{print $NF}' a.txt
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin案例。指定多分隔符
[root@haha1 ~]# cat a.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@haha1 ~]# awk -F":/" '{print $2}' a.txt
root
bin
sbin
var/adm
var/spool/lpd 案例。取出两个root +连续出现1次及1次以上的作为1个整体[root@haha1 ~]# cat a.txt |head -1 >4.txt
[root@haha1 ~]# cat 4.txt
1 root:x:0:0:root:/root:/bin/bash
[root@haha1 ~]# awk -F "[:/]+" '{print $5,$6}' 4.txt
root root理解正则表达式+
[root@haha1 ~]# echo ---test-+haha1++::|awk -F "-" '{print $4}' #test在第四列
test
[root@haha1 ~]# echo ---test-+haha1++::|awk -F "[-]+" '{print $2}' #前面三个---为一个整体
test
[root@haha1 ~]# echo ---test-+haha1++::|awk -F "[-+]" '{print $5}'[root@haha1 ~]# echo ---test-+haha1++::|awk -F "[-+]" '{print $4}'
test
[root@haha1 ~]# echo ---test-+haha1++::|awk -F "[-+]" '{print $6}'
haha1
[root@haha1 ~]# echo ---test-+haha1++::|awk -F "[-+]+" '{print $3}'
haha1
案例4.awk模式+动作
创建实验环境
[root@haha1 ~]# cat a.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@haha1 ~]# awk -F: 'NR==3{print $3 }' a.txt
2
案例2.取出用户名和最后一列
[root@haha1 ~]# awk -F "[ :]" '{print $2"\t" $NF }' a.txt
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
案例。取出/磁盘使用行的 第四列
指定行+动作
[root@haha1 ~]# df -h|awk 'NR==6'
/dev/sda3 18G 2.0G 16G 12% /
[root@haha1 ~]# df -h|sed -n '/sda3/p'|awk '{print $4}' #第四列
16G
案例。取出dev相关的行的第一列和最后一列
[root@db01 ~]# df -h|awk '/sda3/,/sr0/'
/dev/sda3 18G 2.0G 16G 12% /
/dev/sda1 197M 110M 88M 56% /boot
/dev/sr0 4.4G 4.4G 0 100% /mnt
[root@db01 ~]# df -h|awk 'NR>5&&NR<9'
/dev/sda3 18G 2.0G 16G 12% /
/dev/sda1 197M 110M 88M 56% /boot
/dev/sr0 4.4G 4.4G 0 100% /mnt
[root@db01 ~]# df -h|awk '/sda3/,/sr0/{print $1,$NF}'
/dev/sda3 /
/dev/sda1 /boot
/dev/sr0 /mnt
[root@db01 ~]# df -h|awk 'NR>5&&NR<9{print $1,$NF}'
/dev/sda3 /
/dev/sda1 /boot
/dev/sr0 /mnt
扩展正则:字符串比对
[root@haha1 ~]# awk -F: '$NF=="/bin/bash"' a.txt
1 root:x:0:0:root:/root:/bin/bash
查找以1开头的行
[root@haha1 ~]# awk -F: '/^1/' a.txt
1 root:x:0:0:root:/root:/bin/bash
查找第二列以o开头的
[root@haha1 ~]# awk '$2 ~ /^o/' 3.txt
许旺 haha1 100
杨明硕 haha1 88
查找第三列以1开头的
[root@haha1 ~]# awk '$3 ~ /^1/' 3.txt
数字比较
[root@haha1 ~]# awk -F: '$3>0' a.txt
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@haha1 ~]# cat a.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@haha1 ~]# awk -F: '$3<2 ' a.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
[root@haha1 ~]# awk -F: '$3<=2 ' a.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
成绩单统计
第三列(第二次成绩大于90的)
[root@haha1 ~]# awk '$3>90 ' 3.txt
[root@haha1 ~]# awk '$3>90 ' 3.txt |wc -l #统计人数
9
总结
1.awk取行
awk 'NR==3' file
NR==
NR!=
NR>=
NR<=
NR>
NR<
&&
||
2.awk模糊过滤
awk '/过滤的内容/' file
awk '//,//' file
支持正则
3.awk取列
awk '{print $1}' file
awk '{print $NF}' file 最后一列
4.awk指定分隔符
awk -F:
awk -F ":"
awk -F "[:/]+"
5.awk模式+动作
awk 'NR==6{print $3}'
awk '//{print $3}'
6.字符串比较
awk '$3=="root"' file
awk '$3!="root"' file 不等于
7.awk数值比较
awk '$3==0' file
awk '$3>90' file
awk '$3>80&&$3<90' file
|| 或者