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{} 文件处理后进行的操作