awk命令详解

236 阅读2分钟

awk基本用法:

awk [参数] 'BUGIN{} pattern{} END{}' 文件...

参数:
	-f				指定文件名('BUGIN{} pattern{} END{}'部分的内容可以存入到文件中,用-f调用)
	-F				指定处理行时使用的分隔符
		例:awk -F: '{print $1,$3}' /etc/passwd
	-v var=value	                自定义变量
		FS		输入字段分割符
		例:awk -v FS=':' '{print $1,$3}' /etc/passwd
		OFS		输出字段分隔符
		例:awk -v FS=':' -v OFS=',' '{print $1,$3}' /etc/passwd
''
	RS			        输入记录(行)分割符
	ORS			        输出记录(行)分隔符
	NF			        字段数量
		例:awk '{print NF}' /etc/fstab
	NR			        记录(行)编号
		例:awk '{print NR}' /etc/fstab /etc/inittab
	FNR			        分别记录个文件编号
		例:awk '{print FNR}' /etc/fstab /etc/inittab
	FILENAME	                文件名
		例:awk '{print FILENAME}' /etc/fstab
	ARGC		                文件个数(awk默认自己就是一个文件,所以文件个数等于实际文件个数+1)
		例:awk 'BEGIN{print ARGC}' /etc/passwd /etc/group
	ARGV		                数组,存放的各文件名
		例:awk 'BEGIN{print ARGV[1]}' /etc/passwd
	运算操作符:
		==,!=,>,<,>=,<= ,与&&,或||,非!
			~			右边跟左边进行匹配,配置到才进行操作
			!~			右边跟左边进行匹配,配置到才进行操作
				例:awk -F: '$0 ~ /^root/{print $1,$3}' /etc/passwd
	表达式?语句1:语句2		 表达式成立执行语句1,不成立执行语句2
		例:awk -F: '{$3<500?U="系统用户":U="普通用户";print $1,U}' /etc/passwd
	/模式1/,/模式2/		         对从模式1匹配到到模式2匹配到的之间的内容进行操作
		例:awk -F: '/^root/,/^nobody/' /etc/passwd
	if(表达式){语句;...}[else{语句}]
		例:awk -F: '{if($3>=500){print $1"是普通用户"}else{print $1"是系统用户"}}' /etc/passwd
	if(表达式){语句;...}else if(表达式){语句;...}else{语句;...}
		例:awk 'BEGIN{test=100;if(test>90){print"very good"}else if(test>60){print "good"}else{print "no pass"}}'
	while(表达式){语句;...}
		例:awk -F: '/^root/{i=1;while(i<=NF){print $i,length($i);i++}}' /etc/passwd
	do{语句;...}while(表达式)	  不管表达式的结果是真是假,先要执行一次语句
	for(语句;表达式;语句){语句;...}
		例:awk 'BEGIN{sum=0;for(i=1;i<=100;i++){sum+=i}print sum}'
	break		跳出循环
	continue	跳出本次循环
	next		跳出本行循环
		例:awk -F: '/^root/{i=1;while(i<=NF){if(i==4){next}print $i,length($i);i++}}' /etc/passwd
	数组
		例:统计tcp监听的服务的状态统计
		netstat -tan | awk '/^tcp/{state[$NF]++}END{for(i in state){print i,state[i]}}'
		例:统计httpd日志中各IP地址访问的次数
		awk '{ips[$1]++}END{for(ip in ips){print ip" = "ips[ip]}}' /var/log/httpd/access_log
		
        BEGIN{}				  处理文件前进行的操作
        END{}				  文件处理后进行的操作