首页 > 代码库 > awk的使用方法

awk的使用方法

                             AWK用法
一、知识点一
1、域分割 -F 确定分割符 如果不加-F 默认以空格分割符
 cat /etc/passwd | awk -F: ‘{print $1,$2,$3}‘

2、抽取域
cat /etc/passwd | awk -F: ‘{print $1}‘


3、$0代表全局域,也就是所有的记录
cat /etc/passwd | awk -F: ‘{print $0}‘


4、单独打印记录
cat /etc/passwd | awk -F: ‘{print $1,$4}‘



5、打印报告头
# cat /etc/passwd | awk -F: ‘BEGIN{print "This is system user"}{print $1}‘ | more



6、打印信息尾
# cat /etc/passwd | awk -F: ‘BEGIN{print "This is system user"}{print $1}
END{print "==================="}‘

二、知识点二
awk正则表达式
(1) ~匹配
cat /etc/passwd | awk ‘{if($0~/root/) print $0}‘

(2) 精确匹配
cat /etc/passwd | awk -F: ‘{if($1~/root/) print $1}‘

(3) 不匹配!
cat /etc/passwd | awk ‘$0 !~/root/‘
cat /etc/passwd | awk -F: ‘{if($1~/root/)print $1}‘



(4) 小于
cat /etc/passwd |awk -F: ‘{if($3<200)print $3}‘




(5) 小于或者等于
cat /etc/passwd | awk -F: ‘{if($3<=200)print $3}‘

(6) 大于或者等于
cat /etc/passwd | awk -F: ‘{if($3>=200)print $3}‘

(7) 匹配多个关键字 
cat /etc/passwd | awk -F: ‘$1~/(root|user)/‘

(8) 匹配行首
cat /etc/passwd | awk -F: ‘$1~/^root/‘






(9) awk 使用&& || 
条件1为真&&则条件二执行
条件1为真|| 则条件二不执行


cat /etc/passwd | awk -F: ‘{if($1=="root" && $5=="root")print $0}‘
cat /etc/passwd | awk -F: ‘{if($1=="root" || $1=="sdfsfsdsdsd") print $0}‘

awk NF 和NR
NF 浏览记录域的个数
NR 已读的记录数
 cat /etc/passwd | awk -F: ‘{print NF}‘
cat /etc/passwd | awk -F: ‘{print $1,NR}‘
cat /etc/passwd | awk -F: ‘{if(NR<10 && $1~/root/)print $1}‘

awk 替换
gsub(r,s)
cat /etc/passwd | awk -F: ‘gsub(/root/,"alvinzeng"){print $0}‘



本章练习题:
1 awk 默认以什么为分割符?
空格
 2 抽取/etc/passwd 第一个域和第5个域并且统计他们的行号
cat passwd |awk -F: ‘{print $1,$5,NR}‘
 3 抽取第一个域,并且进行root匹配,然后打印出报告头内容为"This is user"
cat passwd |awk -F: ‘BEGIN{print "this is user"}{if($1~/root/)print $1}‘
4 抽取最后一个域,尾部信息用“########”分割
cat passwd|awk -F: ‘{print $NF}END{print "========="}‘
5 请抽取第一个域,请且匹配以user开头的关键字
cat passwd |awk -F: ‘{if($1~/^user/)print $1}‘
6 匹配全局域带有[0-9]的关键字的域信息
cat passwd |awk -F: ‘$0~/[0-9]/‘
7 请打印出来行后大于30 并且匹配第一个域为mysql的信息条目
cat passwd |awk -F: ‘{if(NR>30 && $1=="mysql")print $0}‘
8 请打印出/etc/passwd 里面最后一个域,并且统计bash有多少个?nologin的有多少个?
cat paasswd |awk -F: ‘{if($NF~/bash$/)print $NF}‘|wc -l
9 请打印出UID小于500 但是大于200的用户信息
cat passwd |awk -F: ‘{if($3>200 && $3<500)print $0}‘
10 请打印出带DHCP关键子的用户信息,并且告诉用户在那一行?
cat passwd|awk -F: ‘{if($0~/DHCP/)print $0,NR}‘
11 请打印出wu开头的用户有几个?
cat passwd |awk -F: ‘{if($0~/^wu/)print $0}‘
12 抽取全域匹配home关键字的有多少个用户?他们是否具bash登录权限
cat passwd |awk -F: ‘{if($0~/home/ && $NF~/bash$/)print $0,$NF}‘
13 匹配行号大于30 并且球UID大于50或者小于500的用户信息
cat passwd |awk -F: ‘{if($3>50 && $3<500 && NR>30)print $0,NR}‘
14 匹配系统用户有多少个? 以及程序用户有多少个?
系统用户和程序用户的区别就是nologin和bash的区别
15 匹配行号小于30的,并且匹配他们的bash的用户有多少个,在输出他们的行号?