awk入门
基本语法
awk [options] 'Pattern{Action}' file
ps:
- options :-F 和-v
- action :print和printf
- Pattern :两种特殊模式BEGIN和END
Pattern实际上就是条件,默认情况下awk是逐行处理文本的,如果我们指定了条件(Pattern),只有满足了条件的行,才会被处理,不满足则不处理!!
实例:
[release@WEBAPP2 ~]$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' TIME_WAIT 85 CLOSE_WAIT 8 ESTABLISHED 150
ps:/^tcp/(Pattern)只处理以tcp开头的行;最后处理END(特殊模式)指定的action。
Action(常用print)
示例1:
[release@log-backup ~]$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 288G 70G 204G 26% / tmpfs 16G 0 16G 0% /dev/shm /dev/sda1 194M 34M 150M 19% /boot /dev/mapper/LogStorage-lv01 16T 6.0T 9.1T 40% /logstorage [release@log-backup ~]$ df -h |awk '{print $5}' Use% 26% 0% 19% 40% You have mail in /var/spool/mail/release
ps:
- 此示例没有使用到options和pattern,awk '{print $5}'表示df -h 输出的第5列,
- $5表示当前行按照分隔符分隔后的第5列,
- 不指定分隔符时,默认使用空格作为分隔符,且将连续的空格作为一个分隔符处理
- awk逐行处理数据
示例2:输出多列,以逗号隔开
[release@log-backup ~]$ df -h |awk '{print $2,$5}' Size Use% 288G 26% 16G 0% 194M 19% 16T 40% You have mail in /var/spool/mail/release
示例3:添加自定义字段
[release@log-backup ~]$ df -h |awk '{print "总空间:",$2,"已使用:",$5}' 总空间: Size 已使用: Use% 总空间: 288G 已使用: 26% 总空间: 16G 已使用: 0% 总空间: 194M 已使用: 19% 总空间: 16T 已使用: 40% You have mail in /var/spool/mail/release
Pattern(两种特殊模式BEGIN和END)
示例1:BEGIN处理文本前,先执行
[root@localhost ~]# awk 'BEGIN{print "begin"}' begin
示例2:
[release@PSC ~]$ df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda3 48G 40G 5.1G 89% / /dev/sda1 198M 13M 176M 7% /boot tmpfs 1.5G 0 1.5G 0% /dev/shm [release@PSC ~]$ df -h |awk 'BEGIN{print "BEGIN first done"}{print $2,$5}' BEGIN first done 容量 已用% 48G 89% 198M 7% 1.5G 0%
ps:红色字体即为处理文本前,执行的BEGIN指定的Action.
示例3:END文本处理完后,最后执行指定的Action
[release@PSC ~]$ df -h |awk 'END{print "END done ......"}{print $2,$5}' 容量 已用% 48G 89% 198M 7% 1.5G 0% END done ......
awk的变量
内置变量
属性 |
说明 |
$0 |
当前记录(作为单个变量) |
$1~$n |
当前记录的第n个字段,字段间由FS分隔 |
FS |
输入字段分隔符 默认是空格 |
NF |
当前记录中的字段个数,就是有多少列 |
NR |
已经读出的记录数,就是行号,从1开始 |
RS |
输入的记录他隔符默 认为换行符 |
OFS |
输出字段分隔符 默认也是空格 |
ORS |
输出的记录分隔符,默认为换行符 |
ARGC |
命令行参数个数 |
ARGV |
命令行参数数组 |
FILENAME |
当前输入文件的名字 |
IGNORECASE |
如果为真,则进行忽略大小写的匹配 |
ARGIND |
当前被处理文件的ARGV标志符 |
CONVFMT |
数字转换格式 %.6g |
ENVIRON |
UNIX环境变量 |
ERRNO |
UNIX系统错误消息 |
FIELDWIDTHS |
输入字段宽度的空白分隔字符串 |
FNR |
当前记录数 |
OFMT |
数字的输出格式 %.6g |
RSTART |
被匹配函数匹配的字符串首 |
RLENGTH |
被匹配函数匹配的字符串长度 |
SUBSEP |
数组分隔符。将(I,J)转换为 I SUBSEP J, 模拟多维数组用 |
示例1:
[release@PSC ~]$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [release@PSC ~]$ awk -F: '{print $1,$NF}' /etc/passwd root /bin/bash bin /sbin/nologin daemon /sbin/nologin [release@PSC ~]$ awk -v FS=':' '{print $1,$NF}' /etc/passwd root /bin/bash bin /sbin/nologin daemon /sbin/nologin
ps:
- -F和-v为options
- -F:和-v FS=":"指定输入分隔符为:
- $NF为最后一列
示例2:指定FS和OFS
[release@PSC ~]$ awk -v FS=':' -v OFS='----->' '{print $1,$NF}' /etc/passwd root----->/bin/bash bin----->/sbin/nologin daemon----->/sbin/nologin
示例3:(NR,NF)
[release@PSC ~]$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [release@PSC ~]$ awk -v FS=':' '{print NR,NF}' /etc/passwd 1 7 2 7 3 7
示例4:(FNR)
[release@PSC test]$ awk '{print $0}' test t:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [release@PSC test]$ awk '{print $0}' test2 abayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin release:x:500:500::/home/release:/bin/bash zabbix:x:501:501::/home/zabbix:/sbin/nologin [release@PSC test]$ awk '{print NR,$0}' test test2 1 t:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 abayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin 5 release:x:500:500::/home/release:/bin/bash 6 zabbix:x:501:501::/home/zabbix:/sbin/nologin [release@PSC test]$ awk '{print FNR,$0}' test test2 1 t:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 1 abayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin 2 release:x:500:500::/home/release:/bin/bash 3 zabbix:x:501:501::/home/zabbix:/sbin/nologin
示例5:(RS)
[release@PSC test]$ awk -v RS=':' '{print NR,$0}' test 1 root 2 x 3 0 4 0 5 root 6 /root 7 /bin/bash bin 8 x 9 1 10 1 11 bin 12 /bin 13 /sbin/nologin daemon 14 x 15 2 16 2 17 daemon 18 /sbin 19 /sbin/nologin
示例6:(ORS)
[release@PSC test]$ awk -v ORS='===' '{print NR,$0}' test 1 root:x:0:0:root:/root:/bin/bash===2 bin:x:1:1:bin:/bin:/sbin/nologin===3 daemon:x:2:2:daemon:/sbin:/sbin/nologin===[release@PSC test]$
示例7:(RS和ORS)
[release@PSC test]$ awk -v RS=':' -v ORS='==' '{print NR,$0}' test 1 root==2 x==3 0==4 0==5 root==6 /root==7 /bin/bash bin==8 x==9 1==10 1==11 bin==12 /bin==13 /sbin/nologin daemon==14 x==15 2==16 2==17 daemon==18 /sbin==19 /sbin/nologin ==[release@PSC test]$
示例8:(ARGV,ARGC)
[release@PSC test]$ awk 'BEGIN{print "Begin..."}' test test2 Begin... [release@PSC test]$ awk 'BEGIN{print "Begin...",ARGV[1]}' test test2 Begin... test [release@PSC test]$ awk 'BEGIN{print "Begin...",ARGV[0],ARGV[1],ARGV[2],ARGC}' test test2 Begin... awk test test2 3
PS:awk规定'pattern{action}'不被看做是参数,awk被看做参数.
自定义变量
- -v var=value
- program中直接定义
示例1:
[release@PSC test]$ awk -v myVar="testVar" 'BEGIN{print myVar}' testVar
示例2:
[release@PSC test]$ awk 'BEGIN{Myvar="testVar";print Myvar}' testVar
awk的格式化输出
printf
示例1:
[release@PSC test]$ echo testString testString [release@PSC test]$ printf testString testString[release@PSC test]$ [release@PSC test]$ printf 'testString\n' testString
ps:printf自己定制格式
常用格式替代符
%d | 十进制整数 |
%f | 浮点格式 |
%o | 不带正负号的八进制值 |
%s | 字符串 |
%% | 字面意义的% |
示例2:
[release@PSC test]$ printf "( %s )" 1 2 43 55;echo '' ( 1 )( 2 )( 43 )( 55 ) [release@PSC test]$ printf "%s\n" 1 2 43 55 1 2 43 55
示例3:
[release@PSC test]$ printf '%s %s\n' 姓名 年龄 欧阳司马 12 黄埔明月 13 姓名 年龄 欧阳司马 12 黄埔明月 13 [release@PSC test]$ printf '%15s %15s\n' 姓名 年龄 欧阳司马 12 黄埔明月 13 姓名 年龄 欧阳司马 12 黄埔明月 13 [release@PSC test]$ printf '%-15s %-15s\n' 姓名 年龄 欧阳司马 12 黄埔明月 13 姓名 年龄 欧阳司马 12 黄埔明月 13
ps:
- %s格式替换符
- 数字代表占位宽度
- -左对齐,+右对齐
示例4:
[release@PSC test]$ printf '%d\n' 1 2 3 4 5 1 2 3 4 5 [release@PSC test]$ awk 'BEGIN{printf "%d\n",1,2,3,4,5}' 1 [release@PSC test]$ awk 'BEGIN{printf "%d\n%d\n%d\n%d\n%d\n",1,2,3,4,5}' 1 2 3 4 5
ps:
- 指定格式和被格式化文本之间用逗号隔开
- 格式中的格式替换符必须与被格式化文本一一对应。
示例5:
[release@PSC test]$ cat test root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [release@PSC test]$ awk -F: 'BEGIN{printf "%s\t%-15s\n","用户名","用户bash"}{printf "%s\t%-15s\n",$1,$NF}' test 用户名 用户bash root /bin/bash bin /sbin/nologin daemon /sbin/nologin