Linux 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 /etc/passwd | awk -F: 'BEGIN{i=0}{i++}{print i, $1,$5}'
  cat -n  /etc/passwd | awk -F: '{print $1"=="$5}'
3 抽取第一个域,并且进行root匹配,然后打印出报告头内容为"This is user"
:cat /etc/passwd | awk -F: 'BEGIN{print "This is user:"}{if($1~"root")print $1}'
4 抽取最后一个域,尾部信息用“########”分割
:cat /etc/passwd | awk -F: '{print $NF}END{print "#######"}'
5 请抽取第一个域,请且匹配以user开头的关键字
:cat /etc/passwd | awk -F: '{if($0~"^user")print $1}'
6 匹配全局域带有[0-9]的关键字的域信息
:cat /etc/passwd | awk -F: '{if($0~"[0-9]")print $0}'
7 请打印出来行后大于30 并且匹配第一个域为mysql的信息条目
:cat /etc/passwd | awk -F: 'NR>=30{if($1~"mysql")print $1}'
8 请打印出/etc/passwd 里面最后一个域,并且统计bash有多少个?nologin的有多少个?
:cat /etc/passwd | awk -F"/" '{print $NF}' |grep "nologin" |wc -l
9 请打印出UID小于500 但是大于200的用户信息
:cat /etc/passwd | awk -F: '{if($3<500 && $4>200)print "uid="$3,"gid="$4}'
10 请打印出带DHCP关键子的用户信息,并且告诉用户在那一行?
:cat /etc/passwd | awk -F: 'BEGIN{i=0}{i++}{if($0~"ftp")print "this user at:"i,$0}'
11 请打印出wu开头的用户有几个?
:cat /etc/passwd | awk -F: '{if($1~"^p")print $1}' | wc -l
12 抽取全域匹配home关键字的有多少个用户?他们是否具bash登录权限
:cat /etc/passwd | awk -F"/" '{if($0~"home")print $0}' | awk  -F"/" '{if($NF=="nologin")print $1}' | awk -F: '{print $1"--cannot login"}'

13 匹配行号大于30 并且球UID大于50或者小于500的用户信息
:cat /etc/passwd | awk -F: 'NR>30{if($3>50 && $4<500)print "uid="$3,"gid="$4}'
14 匹配系统用户有多少个? 以及程序用户有多少个?
:nologi与login
15 匹配行号小于30的,并且匹配他们的bash的用户有多少个,在输出他们的行号?
:cat  /etc/passwd | awk  -F:(都差不多,不想写了,自己写写吧)






猜你喜欢

转载自iotos.iteye.com/blog/2092920