您的位置:首页 > 运维架构 > Shell

awk 实战

2016-08-22 20:03 344 查看
1. 生成数据报表

   有一个数据文件datafile是某位业务员的客户们3个月来的交易统计。datafile中的数据以冒号为分隔符,分了5个字段,分别为用户的name,电话phone,1月的消费金额,2月的消费金额,3月的消费金额,

  要求:(1)生成人可读的数据报表,格式清晰

        (2)生成每位客户(每行记录)的3个月的消费总数,以及每个月的总营业额;

    awk脚本:

report.awk

#!/usr/bin/awk -f

# 生成数据报表

BEGIN {

FS = ":";

OFS = "\t"

print "\t\t Report tables"

print "name\tphone\t\tJan\tFeb\tMar\t\tTotal"

print "——————————————————————————————————————————————————————"

}

# 求客户3个月的业绩和

{$6 = $3 + $4 + $5}

#{printf "%-8s%-15s%-9s%-8s%-15s%-12s\n", $1,$2,$3,$4,$5,$6}

{print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t\t"$6}

{total3 +=$3}

{total4 +=$4}

{total5 +=$5}

END {

print "_______________________________________________________"

print "This is Jan total: " total3

print "This is Feb total: " total4

print "This is Mar total: " total5

}


[root@web1 test]# awk -f report.awk datafile

Report tables

name    phone           Jan     Feb     Mar             Total

——————————————————————————————————————————————————————

M H     (424)2222233    299     242     332322          332863

N H     (423)2234242    345     3242    232             3819

N J     (334)1992332    234     34242   324             34800

_______________________________________________________

This is Jan total: 878

This is Feb total: 37726

This is Mar total: 332878


2. awk 多文件联合处理

 

  2.1 用一个文件的域替换另一个文件的域

 系统用户文件passwd的第二段是用户密码,但是用X代替。真正的密码保存在shadow文件中的第二段。现在用shdow中的密文部分替换passwd中的x,生成一个新的passwd.pub

vim join.awk

# 替换文件的域

BEGIN {

# 指定输出分隔符

OFS = ":"

# 输入字段分隔符

FS = ":"

}

# 执行体

{

if (NR <= FNR){        # 正在处理第一个输入文件shadow

a[$1] = $2

}

if (NR > FNR){         # 正在处理第二个输入文件passwd

$2 = a[$1]

print

}

}


awk -f join.awk /etc/shadow /etc/passwd > passwd.pub


 小结: NR 是awk正在工作中的记录数,FNR是awk的当前输入文件的记录数,一开始工作时,NR<FNR,随着输入记录的增多NR会超过FNR.

      

  awk内建变量的用法:

 eg.

 直接做判断

# 执行体

NR <= FNR {        # 正在处理第一个输入文件shadow

a[$1] = $2

}

NR > FNR {         # 正在处理第二个输入文件passwd

$2 = a[$1]

# 输出一整条记录==print $0

print

}


  

3. 检验passwd格式的正确性

不合法的情况可能有:

 (1)记录域数量不为7

 (2)用户名违规,不包含任何字母或数字

 (3)未设置密码,(密码字段应该是x,而不是"*")

passwd.check.awk

# check passwd

BEGIN {

FS = ":"

}

# 执行体

NF != 7 {                                                 //  引用内建变量NF 做判断

printf("line %d, does not have 7 fields: %s\n", NR, $0)

}

$1 !~ /[a-zA-Z0-9]/{                                      // !~ 不匹配正则

printf("line %d, non alpha and nnumeric user id: %s\n", NR, $0)

}

$2 == "*" {                                              //  == 语法类似于C语言

printf("line %d, no password: %s\n", NR, $0)

}


  

  

  

1. 生成数据报表

   有一个数据文件datafile是某位业务员的客户们3个月来的交易统计。datafile中的数据以冒号为分隔符,分了5个字段,分别为用户的name,电话phone,1月的消费金额,2月的消费金额,3月的消费金额,

  要求:(1)生成人可读的数据报表,格式清晰

        (2)生成每位客户(每行记录)的3个月的消费总数,以及每个月的总营业额;

    awk脚本:

report.awk

#!/usr/bin/awk -f

# 生成数据报表

BEGIN {

FS = ":";

OFS = "\t"

print "\t\t Report tables"

print "name\tphone\t\tJan\tFeb\tMar\t\tTotal"

print "——————————————————————————————————————————————————————"

}

# 求客户3个月的业绩和

{$6 = $3 + $4 + $5}

#{printf "%-8s%-15s%-9s%-8s%-15s%-12s\n", $1,$2,$3,$4,$5,$6}

{print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t\t"$6}

{total3 +=$3}

{total4 +=$4}

{total5 +=$5}

END {

print "_______________________________________________________"

print "This is Jan total: " total3

print "This is Feb total: " total4

print "This is Mar total: " total5

}


[root@web1 test]# awk -f report.awk datafile

Report tables

name    phone           Jan     Feb     Mar             Total

——————————————————————————————————————————————————————

M H     (424)2222233    299     242     332322          332863

N H     (423)2234242    345     3242    232             3819

N J     (334)1992332    234     34242   324             34800

_______________________________________________________

This is Jan total: 878

This is Feb total: 37726

This is Mar total: 332878


2. awk 多文件联合处理

 

  2.1 用一个文件的域替换另一个文件的域

 系统用户文件passwd的第二段是用户密码,但是用X代替。真正的密码保存在shadow文件中的第二段。现在用shdow中的密文部分替换passwd中的x,生成一个新的passwd.pub

vim join.awk

# 替换文件的域

BEGIN {

# 指定输出分隔符

OFS = ":"

# 输入字段分隔符

FS = ":"

}

# 执行体

{

if (NR <= FNR){        # 正在处理第一个输入文件shadow

a[$1] = $2

}

if (NR > FNR){         # 正在处理第二个输入文件passwd

$2 = a[$1]

print

}

}


awk -f join.awk /etc/shadow /etc/passwd > passwd.pub


 小结: NR 是awk正在工作中的记录数,FNR是awk的当前输入文件的记录数,一开始工作时,NR<FNR,随着输入记录的增多NR会超过FNR.

      

  awk内建变量的用法:

 eg.

 直接做判断

# 执行体

NR <= FNR {        # 正在处理第一个输入文件shadow

a[$1] = $2

}

NR > FNR {         # 正在处理第二个输入文件passwd

$2 = a[$1]

# 输出一整条记录==print $0

print

}


  

3. 检验passwd格式的正确性

不合法的情况可能有:

 (1)记录域数量不为7

 (2)用户名违规,不包含任何字母或数字

 (3)未设置密码,(密码字段应该是x,而不是"*")

passwd.check.awk

# check passwd

BEGIN {

FS = ":"

}

# 执行体

NF != 7 {                                                 //  引用内建变量NF 做判断

printf("line %d, does not have 7 fields: %s\n", NR, $0)

}

$1 !~ /[a-zA-Z0-9]/{                                      // !~ 不匹配正则

printf("line %d, non alpha and nnumeric user id: %s\n", NR, $0)

}

$2 == "*" {                                              //  == 语法类似于C语言

printf("line %d, no password: %s\n", NR, $0)

}


  

  

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  awk shell awk