awk的作用 GNU/AWK
awk本身就是一门编程语言
1、取行
2、取列
3、模糊过滤
4、判断比较
字符串比对
数字比对
5、支持if for while 数组等
6、格式化输出
语法结构:awk ‘模式’ 文件 #默认就是输出 不需要添加动作
awk ‘模式+动作’ 文件
其他命令的输出|作为awk命令的输入
df -h | awk ‘NR==2’ #取出df -h 的第二行
awk取行
语法结构:sed -n ‘3p’ 文件 #取出文件的第三行
awk ‘NR==3’ 文件 #取出文件的第三行
NR awk的内置变量 存储着每行的行号
符号
== 等于第几行
> 大于第几行
>= 大于等于第几行
< 小于第几行
<= 小于等于第几行
!= 不等于第几行
&& 并且 类似于sed的1,3
|| 或者
awk默认就是输出的动作 如果只输出则不需要加print
[root@oldboyedu ~]# awk 'NR==1' passwd
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# awk 'NR==1{print}' passwd
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# awk 'NR==1||NR==5{print}' passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
eg:awk取出文件的第三行
[root@oldboyedu ~]# awk 'NR==3' passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
eg:awk取出文件大于7的行
[root@oldboyedu ~]# awk 'NR>7' passwd
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
eg:awk取出文件中小于3的行
[root@oldboyedu ~]# awk 'NR<3' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
eg:awk取出文件中小于等于3的行
[root@oldboyedu ~]# awk 'NR<=3' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
eg:awk取出不等于1的行
[root@oldboyedu ~]# awk 'NR!=1' passwd
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
eg:查找出大于3并且小于5的行
[root@oldboyedu ~]# awk 'NR>3&&NR<5' passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
eg:输出文件中的第一行或者第5行
[root@oldboyedu ~]# awk 'NR==1||NR==5' passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
模糊过滤
语法结构:支持正则
sed -n ‘//p’ 文件
awk '//' 文件 #模糊的查找文件中的字符串
awk ‘//,//’ 文件 #区间范围
eg:找出包含root的行
[root@oldboyedu ~]# awk '/root/' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
eg:找出包含bash的行
[root@oldboyedu ~]# awk '/bash/' passwd
root:x:0:0:root:/root:/bin/bash
eg:找出以a开头的行
[root@oldboyedu ~]# awk '/^a/' passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
eg:找出文件中包含root或adm的行
[root@oldboyedu ~]# awk '/root|adm/' passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
eg:找出以s或者以b开头的行
[root@oldboyedu ~]# awk '/^[bs]/' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
eg:按照区间过滤 常用于过滤日志中的时间范围
[root@oldboyedu ~]# awk '/adm/,/halt/' passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[root@oldboyedu ~]# df -h | awk 'NR>3&&NR<8'
tmpfs 475M 19M 456M 4% /run
tmpfs 475M 0 475M 0% /sys/fs/cgroup
/dev/mapper/klas-root 47G 4.8G 43G 11% /
tmpfs 475M 4.0K 475M 1% /tmp
[root@oldboyedu ~]# df -h |awk '/run$/,/tmp$/'
tmpfs 475M 19M 456M 4% /run
tmpfs 475M 0 475M 0% /sys/fs/cgroup
/dev/mapper/klas-root 47G 4.8G 43G 11% /
tmpfs 475M 4.0K 475M 1% /tmp
awk取列
语法结构:awk ‘{print $1}’ 文件 #取出文件中的第一列
默认按照空格或者tab键分隔成列
如果没有空格或tab键,awk会将整行看成一列
在awk中一切在动作中的字符串都被看做是变量,加上双引号则视为普通的字符串
awk内置变量
$0 #表示整行
$1 #表示文件的第一列
$2 #表示文件的第二列
, #逗号表示空格
NF #表示每一行最后一列的列号
eg:取出文件中的第一列
[root@oldboyedu ~]# cat 6.txt
a b
a b c
b c d
q w e r
[root@oldboyedu ~]# awk '{print $1}' 6.txt
a
a
b
q
eg:取出文件中的第3列
[root@oldboyedu ~]# awk '{print $3}' 6.txt
c
d
e
eg:取出文件中的第一列和第三列
[root@oldboyedu ~]# awk '{print $1,$3}' 6.txt
a
a c
b d
q e
[root@oldboyedu ~]# awk '{print $1" "$3}' 6.txt
a
a c
b d
q e
[root@oldboyedu ~]# awk '{print $1","$3}' 6.txt
a,
a,c
b,d
q,e
#""还原特殊字符原本的含义
eg:取出文件文件中的第3列和第1列
[root@oldboyedu ~]# awk '{print $3,$1}' 6.txt
a
c a
d b
e q
eg:取出文件中的最后一列
[root@oldboyedu ~]# awk '{print $4}' 6.txt
r
eg:取出文件中的最后一列
[root@oldboyedu ~]# awk '{print $NF}' 6.txt
b
c
d
r
#NF表示取得是每一行的最后一个字符
[root@oldboyedu ~]# cat 6.txt
a b
a b c
b c d
q w e r
[root@oldboyedu ~]# awk '{print NF}' 6.txt
2
3
3
4
[root@oldboyedu ~]# awk '{print $NF}' 6.txt
b
c
d
r
awk支持数值的运算,即加减乘除
[root@oldboyedu ~]# awk '{print "a"}' 6.txt
a
a
a
a
[root@oldboyedu ~]# awk '{print 10+1}' 6.txt
11
11
11
11
eg:获取文件的倒数第二列
[root@oldboyedu ~]# cat 6.txt
a b y
a b c
b c d
q w e
[root@oldboyedu ~]# awk '{print $(NF-1)}' 6.txt
b
b
c
w
[root@oldboyedu ~]# awk '{print $0}' 6.txt
a
a b
b c d
q w e c
[root@oldboyedu ~]# awk '{print $(NF-1)}' 6.txt
a
a
c
e
[root@oldboyedu ~]# df -h |awk '{print $(NF-1)}'
已用%
0%
0%
4%
0%
11%
1%
15%
0%
eg:取出passwd文件中的第一列
[root@oldboyedu ~]# awk '{print $1}' passwd
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
awk指定分隔符
语法结构:awk -F: '{print $1}' #第一种指定分隔符方式
awk -F ":" '{print $1}' #第二种指定分隔符方式
eg:取出passwd中的用户名 以冒号分隔
[root@oldboyedu ~]# awk -F: '{print $1}' passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
如果指定了分隔符,默认的空格和tab键分隔符会失效
[root@oldboyedu ~]# cat aa.txt
root: x : 0:0: ro ot
[root@oldboyedu ~]# awk -F: '{print $NF}' aa.txt
ro ot
eg:取出passwd中的第六列
[root@oldboyedu ~]# awk -F: '{print $6}' passwd
/root
/bin
/sbin
/var/adm
/var/spool/lpd
/sbin
/sbin
/sbin
/var/spool/mail
/root
eg:取出passwd中的第一列和最后一列 用户名和bash解释器
[root@oldboyedu ~]# awk -F ":" '{print $1"\t"$NF}' passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
eg:统计成绩
[root@oldboyedu ~]# cat count.txt
张三 linux96 100
李四 linux96 22
老王 linux96 33
张赛 linux96 44
[root@oldboyedu ~]# awk '{print $1,$NF}' count.txt
张三 100
李四 22
老王 33
张赛 44
eg:按照成绩的逆序排序
[root@oldboyedu ~]# awk '{print $1,$NF}' count.txt | sort -rnk2
张三 100
张赛 44
老王 33
李四 22
eg:万物皆可分隔
[root@oldboyedu ~]# echo oldboy | awk -Fd '{print $1}'
ol
[root@oldboyedu ~]# echo oldboy | awk -Fdb '{print $1}'
ol
[root@oldboyedu ~]# echo oldboy | awk -Fdb '{print $1,$2}'
ol oy
eg:指定多个字符为分隔符
[root@oldboyedu ~]# cat aa.txt
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# awk -F ":/" '{print $2}' aa.txt
root
eg:指定冒号或者/分隔符
[root@oldboyedu ~]# cat aa.txt
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# awk -F ":|/" '{print NF}' aa.txt
10
[root@oldboyedu ~]# awk -F ":|:/" '{print NF}' aa.txt
7
[root@oldboyedu ~]# awk -F ":|:/" '{print $NF}' aa.txt
bin/bash
eg:使用任意单个字符串作为分隔符 [] 任意单个含义
[root@oldboyedu ~]# cat aa.txt
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# awk -F"[:/]" '{print NF}' aa.txt
10
eg:使用正则+
[root@oldboyedu ~]# awk -F"[:/]+" '{print NF}' aa.txt
8
[root@oldboyedu ~]# grep '[:/]' aa.txt -o
:
:
:
:
:
/
:
/
/
[root@oldboyedu ~]# egrep '[:/]+' aa.txt
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# egrep '[:/]+' aa.txt -o
:
:
:
:
:/
:/
/
[root@oldboyedu ~]# cat bb.txt
--:-/test--/::oldboy-oldgirl
[root@oldboyedu ~]# awk -F"[-:/]" '{print $6}' bb.txt
test
[root@oldboyedu ~]# awk -F"[-:/]" '{print $11}' bb.txt
oldboy
[root@oldboyedu ~]# awk -F"[-:/]+" '{print $2}' bb.txt
test
[root@oldboyedu ~]# awk -F"[-:/]+" '{print $3}' bb.txt
oldboy
awk模式+动作
模式:通过NR找出指定的行 awk ‘NR==5’
通过模糊过滤的方式找出行 awk ‘/root/’
awk ‘NR==5{print $1}’
eg:输出文件中的第2行的第2列
[root@oldboyedu ~]# cat 6.txt
a
a b
b c d
q w e c
[root@oldboyedu ~]# awk 'NR==2{print $2}' 6.txt
b
eg:输出文件中大于第二行的最后一列内容
[root@oldboyedu ~]# awk 'NR>2{print $NF}' 6.txt
d
c
[root@oldboyedu ~]# awk 'NR>2{print $1,$NF}' 6.txt
b d
q c
eg:指定分隔符输出第一行的第一列
[root@oldboyedu ~]# awk -F: 'NR==1{print $1}' passwd
root
eg:输出包含adm的行的第三列
[root@oldboyedu ~]# awk -F: '/adm/{print $3}' passwd
3
#awk面试题:
我有一个文档,取出文件中的第五行的第三列
[root@oldboyedu ~]# awk 'NR==5{print $3}' 文件
eg:取出包含adm行的第三行的第三列
[root@oldboyedu ~]# awk '/adm/' passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
adm:x:30:4:adm:/var/adm:/sbin/nologin
adm:x:36:4:adm:/var/adm:/sbin/nologin
[root@oldboyedu ~]# awk '/adm/{print $3}' passwd
[root@oldboyedu ~]# awk -F: '/adm/{print $3}' passwd
3
30
36
[root@oldboyedu ~]# awk -F: '/adm/{print $3}' passwd |tail -1
36
比较表达式
##按照字符比对查找
eg:查找文件中第一列等于root的行
[root@oldboyedu ~]# awk -F: '$1=="root"' passwd
root:x:0:0:root:/root:/bin/bash
eg:使用正则匹配字符串
[root@oldboyedu ~]# awk -F: '$1~"^r"' passwd
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# awk -F: '$1~"n$"' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
eg:匹配最后一列以n结尾的行
[root@oldboyedu ~]# awk -F: '$NF~"n$"' passwd
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
adm:x:30:4:adm:/var/adm:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
adm:x:36:4:adm:/var/adm:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
eg:对第一列root的行进行取反
[root@oldboyedu ~]# awk -F: '$1!="root"' passwd
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
adm:x:30:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
adm:x:36:4:adm:/var/adm:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
eg:对开头是r的行进行取反
[root@oldboyedu ~]# awk -F: '$1!~"^r"' passwd
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
adm:x:30:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
adm:x:36:4:adm:/var/adm:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
##数字比对
eg:第三列等0的行
[root@oldboyedu ~]# awk -F: '$3==0' passwd
root:x:0:0:root:/root:/bin/bash
eg:第三列大于5的行
[root@oldboyedu ~]# awk -F: '$3>5' passwd
adm:x:30:4:adm:/var/adm:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
adm:x:36:4:adm:/var/adm:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
eg:考试成绩取出大于90分的
[root@oldboyedu ~]# cat count.txt
张三 linux96 100
李四 linux96 22
老王 linux96 33
张赛 linux96 44
[root@oldboyedu ~]# awk '$3>90' count.txt
张三 linux96 100
eg:统计不及格的同学
[root@oldboyedu ~]# awk '$3<60' count.txt
李四 linux96 22
老王 linux96 33
张赛 linux96 44
[root@oldboyedu ~]# awk '$3>90' count.txt | wc -l
1
[root@oldboyedu ~]# awk '$3<60' count.txt | wc -l
3
eg:查看成绩低于90,高于60的同学
[root@oldboyedu ~]# cat count.txt
张三 linux96 100
李四 linux96 22
老王 linux96 33
张赛 linux96 44
张马 linux96 77
[root@oldboyedu ~]# awk '$3>60&&$3<90' count.txt
张马 linux96 77
##了解
[root@oldboyedu ~]# awk -F: 'BEGIN{print "用户名称"}{print $1}' passwd
用户名称
root
bin
daemon
adm
lp
adm
sync
shutdown
halt
adm
mail
operator
[root@oldboyedu ~]# awk -F: 'BEGIN{print "用户名称"}{print $1}END{print "ok...."}' passwd
用户名称
root
bin
daemon
adm
lp
adm
sync
shutdown
halt
adm
mail
operator
ok....
[root@oldboyedu ~]# awk -F: 'BEGIN{print 10+10}'
20
[root@oldboyedu ~]# awk -F: 'BEGIN{print 10-10}'
0
[root@oldboyedu ~]# awk -F: 'BEGIN{print 10*10}'
100
[root@oldboyedu ~]# awk -F: 'BEGIN{print 10^10}'
10000000000
标签:oldboyedu,sbin,14,nologin,24.11,awk,adm,root
From: https://www.cnblogs.com/wjhit/p/18637682