shell编程四剑客之 awk

awk命令

该命令工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。
语法:

awk [option] 'pattern{action}' file...
awk [选项]   '模式{动作}' 文件...    

options 表示选项参数,pattern 表示模式,action 指的是动作,awk擅长文本格式且输出格式化的结果,因此最常用的动作就是print。

常见的选项有:

-F  指定分割符,不指定默认以空格分割,示例: awk -F ':' '{print $1}' file.txt (或awk -F: '{ print $1 }' /etc/passwd)  使用-F 指定分隔符为冒号

模式:

模式其实就表示条件,表示当满足什么条件后做对应的action动作
NR==2  表示取第2行

常用的动作有:

print 	:表示输出打印,示例: awk  '{print $1}' file.txt   # action为print,表示打印第1个变量值	

awk命令也是按行处理文件的,一行处理完毕接着处理下一行,awk会根据用户指定的分隔符进行工作,没有
指定分隔符默认以空格进行分割,awk把每一行分割后的数据对应到内置的变量中。

常用的内置变量:

$0   :表示分割符分割后的全部列,其实就是一整行
$1   :表示分割符分割后的第1列
$2   :表示分割符分割后的第2列
......同理
NF(Number of fields) 分割后,字段总数,字段总数应该是一个整数,如 '{print NF }' 打印出7
$NF  :表示分割符分割后的最后一列,加上$号取值就表示最后一列了 
$(NF-1)  :表示分割符分割后的倒数第二列
$(NF-2)  :表示分割符分割后的倒数第三列
......同理
NR(Number of records):当前行数,行号,通常在模式中使用,如 NR==2表示第2行

演示示例:

[root@master ~]# cat /etc/passwd > file.txt 			#以passwd为例子
[root@master ~]# awk -F ':' '{print $0}' file.txt 		#指定分割符是冒号,输出全部列,其实就是一整行
[root@master ~]# awk -F ':' '{print}' file.txt    		#等价于上一行  
[root@master ~]# awk -F ':' '{print $1}' file.txt 		#指定分割符是冒号,输出打印第1列
[root@master ~]#  awk -F ':' '{print $1 $2}' file.txt 	#指定分割符是冒号,输出打印第1列和第2列,但是第1列和第2列连在一起了
rootx
binx
daemonx
.....
[root@master ~]# awk -F ':' '{print $1,$2}' file.txt 	#第1列和第2列加一个逗号,输出显示会默认空格隔间
[root@master ~]# awk -F ':' '{print "first:",$1,"----","secods:",$2}' file.txt	#print可以加格式化输出,但要使用双引号括起来
[root@master ~]# awk -F ':' '{print $NF}' file.txt				# $NF表示最后一列
[root@master ~]# awk -F ':' '{print $(NF-1)}' file.txt			# $(NF-1)表示倒数第2列
[root@master ~]# awk -F ':' 'NR==5{print $1}' file.txt 			#表示awk找到第5行,输出打印 第1列
[root@master ~]# awk -F ':' 'NR==1,NR==5{print $1}' file.txt 	#这是表示awk找到第1到第5行,输出打印 第1列
[root@master ~]# awk -F ':' '{print NR,$0}' file.txt 			#NR就是行号,输出打印全部行并带行号

猜你喜欢

转载自blog.csdn.net/MssGuo/article/details/117387197