Bootstrap

SHELL学习基本篇-----文本处理(二)

 上一篇博客中我们已经详细介绍了shell脚本中文本处理命令三剑客中的grep、sed,本篇博文将详细介绍剩余的awk命令。

1 awk:报告生成器

awk报告生成器处理机制:awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性的工作,在命令格式上分别体现如下:
BEGIN{}:读入第一行文本之前执行,一般用来初始化操作
{}:逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令
END{}:处理完最后一行文本之后执行,一般用来输出处理结果

2 awk基本用法

基本用法一:
linux上面默认使用gawk,-F指定分隔符
awk '{print FILENAME}' passwd                              #逐行读取文件名称
awk '{print 第“NR”行',有“NF”列}'  passwd                    #NF表示列,NR表示行
awk 'BEGIN{print "NAME"}{print}'   passwd                   #开始的时候打印NAME
awk 'END{print WESTOS}'  passwd                             #结束的时候打印WESTOS
awk -F : 'BEGIN{print NAME}{print $1}END{WESYOS}' passwd    #开始前输出name  输出第一列 结束输出westos
awk '/bash/{print}' passwd                                  #以bash结尾的行的所有列
awk -F : '/bash$/{print $1}'                                #打印以bash结尾的行的第一列

示例:
awk -F : '{print $1}' passwd                                #打印文件的第一列
awk -F : '{print $1$2}' passwd  							#打印文件的第一列和第二列
awk -F : '{print $2}' passwd   								#打印文件的第二列
awk -F : 'BEGIN{print "hello"}{print $2}' passwd  			#在打印第二列开头输出hello
awk -F : 'BEGIN{n=1}{print $2,n}' passwd  					#第二列的每行后面加数字1
awk -F : 'BEGIN{n=1}{print $2,n++}' passwd 					#第二列的每行后面加数字,数字从1每行递增
awk -F : 'BEGIN{n=1}{print n++,$1}' passwd  				#第一列的每行前面加数字,数字从1每行递增
awk -F : 'BEGIN{n=1}{print n++,$1}END{print "over"}' passwd  #第一列的每行前面加数字,数字从1每行递增,最后输出over
awk -F : 'BEGIN{n=1}{print n++,$1}END{print NR}' passwd  	#第一列的每行前面加数字,数字从1每行递增,最后输出总共的行数
awk -F : 'BEGIN{n=1}{print n++,$1}END{print NF}' passwd 	#第一列的每行前面加数字,数字从1每行递增,最后输出总共的列数
awk '/bash/{print}' passwd  								#输出行中存在bash的所有列
awk '/bash/{print $1}' passwd								#输出行中存在bash的所有列,因为没有指定分隔符
awk -F : 'NR==3{print $1}' passwd   						#输出第三行的第一列
awk -F : 'NR==3{print }' passwd								#输出第三行的所有列
awk -F : 'NR>=4&&NR<=6{print}' passwd 						#输出4行到第六行的全部列
awk -F : 'NR==4 || NR==6{print}' passwd 					#输出第四行或者第六行的全部列
awk '{print FILENAME}' passwd								#逐行读取文件名称
awk '{print $0}' passwd  									#打印每一行的所有列,0代表全部的列

怎么输出/etc/passwd以/sbin/nologin结尾的行的个数
awk 'BEGIN{N=0}/nologin$/{N++}END{print N}' /etc/passwd

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

*)awk基本用法二:
awk 'BEGIN{a=34;print a+12}'                     #输出a+12的值
awk -F : '/^ro/{print}' /etc/passwd  		     #输出以ro开头的行的所有列
awk -F : '/^[a-d]/{print $1,$6}' passwd          #输出a或者b或者c或者开头的行的第一列和第六列
awk -F : '/^a|nologin$/{print $1,$6}' passwd     #输出a或者b或者c或者开头并且以nologin结尾的行的第一列和第六列
awk -F : '$6~/bin$/{print $1,$6}' passwd         #第六列以bin结尾的行打印1和6列,贪婪匹配
awk -F : '$6!~/nologin$/{print $1,$6}' passwd    #第六列不以nologin结尾的行 打印1和6列


示例:
awk 'BEGIN{a=34;print a+12}'
awk  '/^[a-d]/{print $1,$6}' passwd  
awk  '/^[^a-d]/{print $1,$6}' passwd              #不以a或者b或者c或者d开头的行的第一列和第六列
awk  '/^r|bash$/{print}' passwd                   #以r开头或者bash结尾的行的所有列
awk '/^r/&&/bash$/{print}' passwd                 #以r开头并且bash结尾的行的所有列
awk '/^r/||/bash$/{print}' passwd                 #以r开头或者bash结尾的行的所有列
awk -F : '$6~/bin$/{print}' passwd                #第六列以bin结尾的行的所有列
awk -F : '$6~/\<bin$/{print}' /etc/passwd         #第六列以关键字bin结尾的行的所有列
awk -F : '$6!~/bin$/{print}' passwd               #第六列不以bin结尾的行的所有列
awk -F : '$6!~/\<bin$/{print}' /etc/passwd        #第六列不以关键字bin结尾的行的所有列

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实例:
1.
把可登陆用户的家目录不在/home/下的用户名显示出来
awk -F : '$6!~/^\/home/{print $1}' /etc/passwd
awk -F : '$6!~/^\/home/&&/bash$/{print $1}' /etc/passwd
awk -F : '$6!~/^\/home/&&$7~/bash$/{print $1}' /etc/passwd
awk -F : 'BEGIN{N=0}$6!~/^\/home/&&7~/bash$/{print $1;N++}END{print N}' /etc/passwd


2.
vim test.sh
#!/bin/bash
[ -z "$1" ] && {
	echo "error:please input interface following script"
 	exit
}
ifconfig $1 &> /dev/null || {
	echo "$1 is not exist"
	exit
}
ifconfig $1 | awk '/inet\>/{print $2}'

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

;