awk 实战
2016-08-22 20:03
344 查看
1. 生成数据报表
有一个数据文件datafile是某位业务员的客户们3个月来的交易统计。datafile中的数据以冒号为分隔符,分了5个字段,分别为用户的name,电话phone,1月的消费金额,2月的消费金额,3月的消费金额,
要求:(1)生成人可读的数据报表,格式清晰
(2)生成每位客户(每行记录)的3个月的消费总数,以及每个月的总营业额;
awk脚本:
report.awk
2. awk 多文件联合处理
2.1 用一个文件的域替换另一个文件的域
系统用户文件passwd的第二段是用户密码,但是用X代替。真正的密码保存在shadow文件中的第二段。现在用shdow中的密文部分替换passwd中的x,生成一个新的passwd.pub
小结: NR 是awk正在工作中的记录数,FNR是awk的当前输入文件的记录数,一开始工作时,NR<FNR,随着输入记录的增多NR会超过FNR.
awk内建变量的用法:
eg.
直接做判断
3. 检验passwd格式的正确性
不合法的情况可能有:
(1)记录域数量不为7
(2)用户名违规,不包含任何字母或数字
(3)未设置密码,(密码字段应该是x,而不是"*")
passwd.check.awk
1. 生成数据报表
有一个数据文件datafile是某位业务员的客户们3个月来的交易统计。datafile中的数据以冒号为分隔符,分了5个字段,分别为用户的name,电话phone,1月的消费金额,2月的消费金额,3月的消费金额,
要求:(1)生成人可读的数据报表,格式清晰
(2)生成每位客户(每行记录)的3个月的消费总数,以及每个月的总营业额;
awk脚本:
report.awk
2. awk 多文件联合处理
2.1 用一个文件的域替换另一个文件的域
系统用户文件passwd的第二段是用户密码,但是用X代替。真正的密码保存在shadow文件中的第二段。现在用shdow中的密文部分替换passwd中的x,生成一个新的passwd.pub
小结: NR 是awk正在工作中的记录数,FNR是awk的当前输入文件的记录数,一开始工作时,NR<FNR,随着输入记录的增多NR会超过FNR.
awk内建变量的用法:
eg.
直接做判断
3. 检验passwd格式的正确性
不合法的情况可能有:
(1)记录域数量不为7
(2)用户名违规,不包含任何字母或数字
(3)未设置密码,(密码字段应该是x,而不是"*")
passwd.check.awk
有一个数据文件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]
}
}
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
}
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]
}
}
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
}
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文本处理实战
- linux实战(一)----日志的截取-----文本过滤器grep、文本流式编辑器sed、报表生成器awk的运用
- 005_awk案例实战
- Linux实战教学笔记18:linux三剑客之awk精讲
- awk数组命令经典生产实战应用拓展
- linux运维实战精囊1(ifconfig,grep,cut,sed,awk)
- awk 实战
- shell awk实战
- awk学习,从入门到实战
- linux运维实战练习及linux shell脚本、awk、sed工具命令学习总结
- AWK日志分析实战
- awk实战:文件里面全是数字,实现大于100的求和并打印出所在行和这些数字的总和
- awk数组实战
- awk实战小例子
- awk数组命令经典生产实战应用拓展
- awk实战——分组统计(允许字符下标)
- awk实战——分组统计(允许字符下标)
- awk学习实战-原创
- [svc]linux正则实战(grep/sed/awk)