第19天 [AWK详解]

AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
举例:
1.所在路径
	[root@centos7 ~]#ll `which awk`
	lrwxrwxrwx. 1 root root 4 May 10 13:05 /usr/bin/awk -> gawk
2.基本用法
	awk '{print $1}' /etc/fstab  -- $1指的是第几列。
	举例:awk '{print 20*10}'
3.可以由3部分组成
	BEGIN{print }{print}END{print}     --BEGIN和END决定了各自的语句在第几行。
	举例:	[root@centos7 data]#awk 'BEGIN{print "number"}{print 20*10}END{print "the end"}' fstab
			number
			200
			200
			200
			200
			the end


4. -F "分隔符"  $0整行,$1第一列
	awk -F ":" '{print $1"\t" $3}' passwd
	
5.1 FS:输入字段分隔符,默认为空白字符
	(1)基本用法 awk -v FS=':' '{print $1,FS,$3}’ /etc/passwd
	方便之处在于如果之前定义好了变量可以直接调用
	[root@centos7 data]#fs=":"
	[root@centos7 data]#awk -v FS=$fs '{print $1 FS $2}' passwd
	(2)指定范围     第一种 df|awk -F ' +|%' '{print $1,$5}
				第二种 awk -F "[ |\[]" '{print $5}' access_log
						awk -F "[ []" '{print $5}' access_log
5.2 OFS:输出字段分隔符,默认为空白字符
	awk -F "[ []" -v OFS="--" '{print $1,$5}' access_log |head -10
	172.18.118.91--20/May/2018:08:09:59
	172.18.118.91--20/May/2018:08:09:59
5.3	RS :输入记录分隔符,指定输入时的换行符
	awk -v RS=' ' ‘{print }’ /etc/passwd
	[root@centos7 data]#cat awktest 
	a,b,c
	d;e,f
	gg;hh;xx
	asd
	默认把';'分割看作一行
	[root@centos7 data]#awk -F "," -v RS=';' '{print $1}' awktest 
	a
	e
	hh
	xx
	asd
5.4 ORS:输出记录分隔符,输出时用指定符号代替换行符
	awk -v RS=' ' -v ORS='###'‘{print }’ /etc/passwd
	[root@centos7 data]#awk -F "," -v ORS='-----' '{print $1,$2}' awktest 
	a b-----d;e f-----gg;hh;xx -----asd -----
5.5 NF:字段数量
	awk -F:'{print NF}' /etc/fstab  引用变量时,变量前不需加$
	awk -F:'{print $(NF-1)}' /etc/passwd
	awk -F":" '{print $(NF)}' passwd  取最后一行
5.6 NR:记录号
	awk ‘{print NR}’ /etc/fstab ; awk END‘{print NR}’ /etc/fstab	
	awk '{print NR, $1}' passwd  加行号
5.7	FNR:各文件分别计数,记录号
	awk '{print FNR}' /etc/fstab /etc/inittab --这样会对每个文件从头编号
	passwd 1 libstoragemgmt
	passwd 2 colord
	passwd 3 rpc
	passwd 4 gluster
	fstab 1 /dev/sda1   		/boot	xfs	defaults 0 0
	fstab 2 /dev/sda2		/	xfs	defaults 0 0 
5.8	FILENAME:当前文件名
	awk '{print FILENAME}’ /etc/fstab
	awk -F":" '{print  FILENAME,FNR,$1}' passwd fstab
5.9	ARGC:命令行参数的个数
	awk '{print ARGC}’ /etc/fstab /etc/inittab
	awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab
5.10 ARGV:数组,保存的是命令行所给定的各参数
	awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab
	awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab
5.11 自定义变量(区分字符大小写)
	(1) -v var=value 	
	(2) 在program中直接定义
	[root@centos7 data]#awk -v NAME='magedu' 'BEGIN{print NAME}'
	magedu
	
	可以直接调用文件
	[root@centos7 data]#echo '{print $1,$3}' > f1.awk
	[root@centos7 data]#awk -F: -f f1.awk passwd fstab 
	root 0
	bin 1
	daemon 2
	adm 3
	lp 4

6	printf
	printf 格式 $1,$2
	%c:显示字符的ASCII码
	%d, %i:显示十进制整数
	%e, %E:显示科学计数法数值 
	%f:显示为浮点数
	%g, %G:以科学计数法或浮点形式显示数值
	%s:显示字符串
	%u:无符号整数
	%%:显示%自身
	#[.#]  第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f
	-  左对齐(默认右对齐) %-15s
	+  显示数值的正负符号 %+d
	echo "aaa:123.456"|awk -F: '{printf "%-10s %10.1f" ,$1,$2}'

	[root@centos7 data]#awk -v NAME='magedu' 'BEGIN{print NAME}'
	magedu
	打印表格
	awk -F: 'BEGIN{print "---------------------------------\nusername       |uid     |\n----------------------"}{printf "%-20s  |   %8d   |\n-----------------------------------\n",$1,$3}' passwd

	支持运算
	x+y, x-y, x*y, x/y, x^y, x%y
	- x:转换为负数
	+x:将字符串转换为数值

	赋值
	=, +=, -=, *=, /=, %=, ^=,++, --
	
	比较操作符:
	==, !=, >, >=, <, <=
	awk -F: '$3==996''{print  $1,$3}' passwd  --中间不许有空格。
	
	模式匹配符:
	~:左边是否和右边匹配,包含 
	!~:是否不匹配
	awk -F: '$1 ~ "rpc"''{print $1,$3}' passwd
	awk -F: '! ($1 ~ "rpc")''{print $1,$3}' passwd
	
	逻辑操作符:与&&,或||,非!
	#awk -F: '! ($1 ~ "rpc")&& $3 <100''{print $1,$3}' passwd

	条件表达式(三目表达式)
	selector?if-true-expression:if-false-expression
	awk -F: '$3<=100?line="less":line="more" {print line, $1,$3}' passwd

	支持正则表达式
	awk -F: '/mail/{print $1,$3}' passwd --找出mail的行

	continue;break
	跳过5:awk 'BEGIN{for(i=0;i<10;i++){if (i==5) continue;print i}}'
	到5直接跳出 awk 'BEGIN{for(i=0;i<10;i++){if (i==5) break;print i}}'

	数组
	awk 'BEGIN{num["a"]=1;num["b"]=2;num["c"]=3;print num["b"]}'


99.实例
	取访问最多的ip
	awk '{print $1}' access_log |sort |uniq -c|sort -nr|head -3
	取基数
	seq 10 |awk 'i=!i'
	取偶数
	seq 10 |awk '!(i=!i)'
	取ip
	ifconfig ens33|awk '/netmask/{print $2}'
	取3-7行
	seq 10|awk 'NR >2 && NR < 8'
	取指定范围的行
	awk -F: '/ftp/,/rpc/{print $1}' passwd
	取大于10的行
	df|awk -F ' +|%' '/\/dev\/sd/{ if($5>10)print $1,$5}'
	while练习
	awk '/linux16/{i=1;while(i<=NF){print $i,length($i);i++}}' /boot/grub2/grub.cfg
	100之内数相加
	awk 'BEGIN{sum=0;for(i=1;i<=100;i++){sum+=i};print sum}'
	打印ip出现的次数 ip[$1]++ 以第一列为下标 一般查询出现最多的ip
	awk '{ip[$1]++}END{for (i in ip){print i,ip[i]}}' access_log
取最大值和最小值
cat num.txt |awk -F"," '{i=1;max=$i;min=$i;while(i<=NF){if($i>max)max=$i;else if($i<min)min=$i;i++}}END{print min ,max}'
取平均数
m 10 
v 13 
v 10 
m 20 
awk '{if($1=="m"){m_sum=m_sum+$2;m_num++}else{v_sum=v_sum+$2;v_num++}}END{print v_sum/v_num,m_sum/m_num}' num2
显示长度为4的字符
awk '{if(length($1)==4)print $1}'
显示空白字符开始的行
awk '/^[ ]/{print $NR,$0}' test2
计算一个目录下的文件大小总和
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值