awk是一个强大的文本分析工具,awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。
一、 awk的基本用法(一)
1. awk -F 指定分隔符,当不使用-F指定分隔符时,将以空白的字符或空格为分隔符
1. [root@localhost awk]#
awk -F ':' '{print $1}' pd
#-F指定分隔符为":" $1表示第一段,
root
bin
daemon
2. [root@localhost awk]#
awk -F ':' '{print $0}' pd
# $0表示所有的段,打印pd文件所有的段
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
3. [root@localhost awk]#
awk -F ':' '{print $1,$4,$7}' pd
#打印多个段,中间用逗号","就可以
root 0 /bin/bash
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
4.
[root@localhost awk]#
awk -F ':' '{print $1"#"$4"#"$7}' pd
#指定打印出来的结果之间的分隔符
root#0#/bin/bash
bin#1#/sbin/nologin
daemon#2#/sbin/nologin
2. awk 指定关键字进行匹配
[root@localhost awk]#
awk '/root/' pd
#匹配出带有root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
3. awk 指定段进行匹配,更加精确
[root@localhost awk]#
awk -F ':' '$1 ~ /root/' pd #指定分隔符为":" 只匹配第一段带有root的行
root:x:0:0:root:/root:/bin/bash
4. awk支持多个表达式一起写
1. [root@localhost awk]#
awk -F ':' '/root/ {print $1,$3} /lx/ {print $1,$3,$4}' pd
root 0 #匹配带有root和lx行,打印root行的1、3段,lx行的1、3、4段
operator 11
lx01 1000 1000
lx02 1001 1001
lx03 1002 1003
2. [root@localhost awk]#
awk '/root|lx/ {print $0}' pd
#匹配出带有root或者lx的行,全部打印出来
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
lx01:x:1000:1000::/home/lx01:/bin/bash
lx02:x:1001:1001::/home/lx02:/bin/bash
lx03:x:1002:1003::/home/lx03:/bin/bash
5. awk支持数学运算符
1. [root@localhost awk]#
awk -F ':' '$3==0 {print $1}' pd
#将pd文件中第3段等于0的行的第一段打印出来
root
2.
[root@localhost awk]#
awk -F ':' '$3>=1000 {print $1}' pd
#
将pd文件中第3段大于等于1000的行的第一段打印出来
lx01
lx02
lx03
sdd
mk100
3.
[root@localhost awk]#
awk -F ':' '$7!="/sbin/nologin" {print $0}' pd
#
将pd文件中第7段不等于/sbin/nologin的行打印出来,使用字符串时要用双引号,数字加上双引号表示字符串
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
lx01:x:1000:1000::/home/lx01:/bin/bash
lx02:x:1001:1001::/home/lx02:/bin/bash
lx03:x:1002:1003::/home/lx03:/bin/bash
mk100:x:1007:1007::/home/mk100:/bin/bash
二 、awk用法(二)
1. awk 支持段与段之间进行比较
[root@localhost awk]#
awk -F ':' '$3>$4' pd
#将pd文件中的第3段大于第4段的行打印出来
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
sdd:x:1006:1002::/home/lkh:/sbin/nologin
[root@localhost awk]#
awk -F ':' '$3>"5" && $3<7 ' pd
#将pd文件中的第3段大于5,且小于7的行打印出来
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
2. awk OFS 指定print后的分隔符
[root@localhost awk]#
awk -F ':' '{OFS="#"} $3>1000 || $7 ~ /bash/ {print $1,$2,$3,$7}' pd #指定print后的分隔符为“#”
root#x#0#/bin/bash
lx01#x#1000#/bin/bash
lx02#x#1001#/bin/bash
lx03#x#1002#/bin/bash
sdd#x#1006#/sbin/nologin
mk100#x#1007#/bin/bash
3. NR 表示行号
[root@localhost awk]#
awk -F ':' '{print NR"#" $0}' pd #打印行号
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
6#sync:x:5:0:sync:/sbin:/bin/sync
4. NF 可以显示一行有多少段
[root@localhost awk]#
awk -F ':' '{print NF"#" $0}' pd
#可以看到一行有7段
7#root:x:0:0:root:/root:/bin/bash
7#bin:x:1:1:bin:/bin:/sbin/nologin
7#daemon:x:2:2:daemon:/sbin:/sbin/nologin
7#adm:x:3:4:adm:/var/adm:/sbin/nologin
7#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7#sync:x:5:0:sync:/sbin:/bin/sync
5. NR和NF可以作为一个判断条件
1. [root@localhost awk]#
awk -F ':' 'NR<=3' pd #打印前3行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
2. [root@localhost awk]#
awk -F ':' 'NR<=10 && $1 ~ /root|sync/' pd
#支持多个条件
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
6. awk 赋值
[root@localhost awk]#
head -n3 /etc/passwd |awk -F ':' '$1="root"' #前三行的第一段全部变为root
root x 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin
7. 求和一列
[root@localhost awk]#
awk -F ':' '{tot=tot+$3}; END {print tot}' pd
7621
8. awk的判断语句
[root@localhost awk]#
awk -F ':' '{if($1=="root") {print $0}}' pd #如果第一段等于0,那么将那一行打印出来
root:x:0:0:root:/root:/bin/bash
习题:
1. 用awk 打印整个test.txt
awk '{print $0}' test.txt
2. 查找所有包含 ‘bash’ 的行
awk '/bash/' test.txt
3. 用 ‘:’ 作为分隔符,查找第三段等于0的行
awk -F ':' '$3==0 {print $0}' test.txt
4. 用 ‘:’ 作为分隔符,查找第一段为 ‘root’ 的行,并把该段的 ‘root’ 换成 ‘toor’ (可以连同sed一起使用)
awk -F ':' '$1=="root" {print $0}' test.txt |sed 's/root/toor/g'
5.用 ‘:’ 作为分隔符,打印最后一段
awk -F ':' '{print $NF}' test.txt
6.打印行数大于20的所有行
awk 'NR>20 {print $0}' test.txt
7.用 ‘:’ 作为分隔符,打印所有第三段小于第四段的行
awk -F ':' '$3<$4 {print $0}' test.txt
awk -F ':' '{OFS="@"} {print $1,$NF}' test.txt
9.用 ‘:’ 作为分隔符,把整个文档的第四段相加,求和
awk -F ":" '{tot4=tot4+$4}; END {print tot4}' test.txt