awk入门

基本语法

awk [options] 'Pattern{Action}' file

ps:

  1. options :-F 和-v
  2. action   :print和printf
  3. 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:

  1. 此示例没有使用到options和pattern,awk '{print $5}'表示df -h 输出的第5列,
  2. $5表示当前行按照分隔符分隔后的第5列,
  3. 不指定分隔符时,默认使用空格作为分隔符,且将连续的空格作为一个分隔符处理
  4. 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:

  1. -F和-v为options
  2. -F:和-v FS=":"指定输入分隔符为:
  3. $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
FNR

示例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
RS

示例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被看做参数.

自定义变量

  1. -v var=value
  2. 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:

  1. %s格式替换符
  2. 数字代表占位宽度
  3. -左对齐,+右对齐

示例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:

  1. 指定格式和被格式化文本之间用逗号隔开
  2. 格式中的格式替换符必须与被格式化文本一一对应。

示例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  

 

posted @ 2017-06-13 17:14  谁能不挨刀  阅读(155)  评论(0编辑  收藏  举报