AWK高级应用
在进行数据割接时,需要对其导出脚本的日志文件进行统计分析以便核对是否有数据没有导出的情况!该日志文件的格式都是固定的,可以使用脚本来完成统计分析,而且脚本很灵活小巧。
因为其复杂的语法和不明确的错误提示,造成awk的使用者进而远之,awk整体上比较难掌握。Awk是一种自解释的编程语言。而awk强大的文本处理功能正好能够胜任该工作。如果要格式化报文或从一个大的文本文件中抽取数据包,那么awk可以完成这些任务。它在文本浏览和数据的熟练使用上性能优异。
Awk的特性网上有很多资料,大家可以参考一下。本次所运用的awk的特性有:
Awk数组、printf修饰符、内置字符串函数、awk操作符、条件操作符。
要想使用好awk,必须对awk的语法有一定的认识,否则你会被一大堆莫名其妙的错误所包围。
Awk语句都是由模式和动作组成。模式的包括俩个关键字,BEGIN和END。BEGIN模式在awk遍历文本前调用,用来打印一些头信息或是声明一些全局变量。例如:
Log.dat记录着日志信息,日志为日期-ip-手机号码。
linux:/home/dss/dss/logs/msgs> cat log.dat
20091111-172230-665-10.168.38.63-15035198115
20091111-172230-738-10.168.38.65-13840784654
20091111-172238-571-10.168.38.63-15929933330
20091111-172238-668-10.168.38.63-13666463997
20091111-172240-262-10.168.38.68-13591931301
20091111-172242-24-10.168.38.63-15041615076
20091111-172248-427-10.168.38.63-13409199466
如果我想统计来自ip10.168.38.63的日志有几个,命令如下:
linux:/home/dss/dss/logs/msgs> awk -F'-' 'BEGIN {printf "%-15s %s\n","IP","LOG"printf “===============================================”}{if($4~/10.168.38.63/)printf "%-15s %s\n", $4,$0}END{}' log.dat
IP LOG
10.168.38.63 20091111-172230-665-10.168.38.63-15035198115
10.168.38.63 20091111-172238-571-10.168.38.63-15929933330
10.168.38.63 20091111-172238-668-10.168.38.63-13666463997
10.168.38.63 20091111-172242-24-10.168.38.63-15041615076
10.168.38.63 20091111-172248-427-10.168.38.63-13409199466
其中头信息IP和LOG在遍历log.dat前打印!
而END模式在遍历完文件最后执行,可以用于信息汇总,或打印结束日志。
实际动作需要包含在{}之间,如果不指明,默认动作是打印所有行。
Awk的域和记录,awk执行时,其浏览域标记为$1,$2… $n。这种方法称为域标识。使用这些域标识将更容易对域进行进一步处理。$0为匹配整行,看个例子:
linux:/home/dss/dss/logs/msgs> awk -F'-' '{print $4, $5}' log.dat
10.168.38.63 15035198115
10.168.38.65 13840784654
10.168.38.63 15929933330
10.168.38.63 13666463997
10.168.38.68 13591931301
10.168.38.63 15041615076
10.168.38.63 13409199466
以上命令只打印第4列和第5列。并且域分隔符为-,默认的域分隔符为空格,使用-F参数指定域分隔符。
awk有许多内置变量用来设置环境信息。这些变量可以被改变。下面列出一些最常使用的一些变量,并给出其基本含义。
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行- F选项
NF 浏览记录的域个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
awk有许多强大的字符串函数,这些字符串函数在处理文本方面起着很重要的作用。通过这些内置字符串处理函数可以很随意的定义一些自己想要的函数。下面为awk中内置字符串处理函数。
gsub (r, s) 在整个$0中用s替代r
gsub (r, s, t) 在整个t中用s替代r
index (s , t) 返回s中字符串t的第一位置
length ( s ) 返回s长度
match (s , r) 测试s是否包含匹配r的字符串
split (s , a , fs) 在f s上将s分成序列a
sprint (fmt , exp) 返回经f m t格式化后的e x p
sub (r, s) 用$ 0中最左边最长的子串代替s
substr (s , p) 返回字符串s中从p开始的后缀部分
substr (s , p , n) 返回字符串s中从p开始长度为n的后缀部分
如下我只要使用index和substr函数就可以组合出很强大的自定义函数:
function substrmid(src, begin, end) {
startindex=index(src,begin) + length(begin)
temp=substr(src,startindex)
endindex=index(temp,end) - length(end)
return substr(src,startindex,endindex)
}
function substrbefore(src, end) {
endindex=index(src,end)-length(end)
return substr(src,0,endindex)
}
function substrafter(src, begin) {
startindex=index(src,begin) + length(begin)
return substr(src,startindex)
}
自定义函数substrbefore(src, end)是截取src中end之前的字符串,substrmid(src, begin, end)是截取src中介于begin和end之间的字符串(不包含begin和end),substrend(src, end)是截取src中end之后的字符换,例如:
Substrmid(“2009-11-01”, “-”,”-”)返回字符串11,substrbefore(“2009-11-01”, “-”)返回2009,substrafter(“11-01”, “-”)返回01,可以根据自己的需要构造一些自定义函数。
最后简单介绍一下awk中的数组应用。Awk是一种类似自解释语言,其中的数据应用可以很好的完成数据统计工作。Awk中数组使用无需提前声明。数组使用前,不必定义,也不必指定数组元素个数。经常使用循环来访问数组。下面是一种循环类型的基本结构
For (element in array ) print array[element]
Awk的特性介绍完了,现在开始实战了!
这个小工具的要求是这样的,在做数据割接时,将数据库的数据按照路由规格利用数据库提供的批量导出工具把数据导出成dat文件,需要对数据库的日志进行统计分析,看看每个分库每个分表导出多少条记录!
SQL3104N The Export utility is beginning to export data to file
"./PISADB10/CONTACTINFO977_1_3717.dat".
中间有若干行无关紧要的内容
Number of rows exported: 24040
其中的./PISADB10/CONTACTINFO977_1_3717.dat和Number of rows exported: 24040为关键信息。
PISADB10表示分库10,CONTACTINFO977_1_3717.dat表示分表1。而Number of rows exported: 24040为导出多少行。而日志文件里有上万行这样的日志,而且大概有100多个日志,要求这个小功能能够做到批量统计。
首先使用grep命令将相关重要信息提取出来,以免其他信息造成干扰。使用命令
Grep –E ‘^Number of rows exported|^".*(CONTACTINFO|DS_CLIENT_MAPPING|GROUPCONTACTMAP)\w*.dat’ db2export_1.sh.log
命令输出格式为:
。。。
"./PISADB5/CONTACTINFO472_1_12012.dat".
Number of rows exported: 40
"./PISADB5/CONTACTINFO473_1_12033.dat".
Number of rows exported: 24040
"./PISADB5/CONTACTINFO474_1_12054.dat".
Number of rows exported: 40
"./PISADB5/CONTACTINFO475_1_12075.dat".
Number of rows exported: 40
"./PISADB5/CONTACTINFO476_1_12096.dat".
Number of rows exported: 40
以上信息才是我想要的。将结果交给awk来处理完成,由于awk本身的机制,awk只能按行来处理文件,一次只能处理一行,所有以上信息处理还需要一些特殊的适配。Awk一次只读一样,如果该行不包含Number说明该行为分库和分表信息行,将其暂存起来,等到下一行Number行时,再对其进行处理。这里可以使用awk中的条件操作符if语句来完成,{if($0!~/Number/) tmp=$0} {if($0~/Number/)print “This is a number line and it’s owner is ”tmp},其中if的条件判断无需用()引起来,但是未避免语句错误最好将所有的条件判断都用()扩起来。!~为不匹配~为匹配,//之间可以输入正则表达式。
当行为number行时,需要将其中的关键数字截取出来做汇总。
if($0!~/Number/){
num=substrafter($0,” exported: ”)
}
这样就将num截取出来了,剩下的就是做汇总信息了!完整的脚本如下:
grep -E '^Number of rows exported|^".*(CONTACTINFO|DS_CLIENT_MAPPING|GROUPCONTACTMAP)\w*.dat' db2export_1.sh.log | awk '
function substrmid(src, begin, end) {
startindex=index(src,begin) + length(begin)
temp=substr(src,startindex)
endindex=index(temp,end) - length(end)
return substr(src,startindex,endindex)
}
function substrbefore(src, end) {
endindex=index(src,end)-length(end)
return substr(src,0,endindex)
}
function substrafter(src, begin) {
startindex=index(src,begin) + length(begin)
return substr(src,startindex)
BEGIN {
flag=""
total=0
table=""
}
{
if($0!~/Number/) {
flag=$0
}
}
{
if($0~/Number/) {
print $0
num=substrafter($0,"exported: ")
partdb=substrmid(flag, "/", "/")
fromtable=substrmid(flag, "_", "_")
P[partdb]=P[partdb]+num
S[fromtable]=S[fromtable]+num
total=total+num
}
}
END {
print "Total number of export: "total
for(p in P){
print p" number of export: "P[p]
}
for(s in S){
print "parttable "s" number of export: "S[s]
}
}
分享到:
相关推荐
Linux awk 高级应用 awk 是一个基于模式匹配检查输入文本的数据处理引擎,由 Aho Wwinberger Kernighan 创造。它通常用在 shell 中,获取指定的数据,单独使用时,可对文本数据做统计。awk 也是一种编程语言,拥有 ...
### 5.6:awk高级应用、综合案例、总结和答疑 #### 案例1:sed综合脚本应用 在这一案例中,我们学习到了如何利用`sed`工具编写一个脚本来提取特定条件下的用户记录,并进一步处理这些记录以生成易于阅读的结果。...
本文将详细解读awk和cut的高级应用,以及如何在shell脚本中添加色彩处理功能,以提高文本信息的可读性和美观性。 首先,我们来探讨如何在shell脚本中添加色彩处理。在Linux中,可以通过echo命令配合转义字符来显示...
Linuxsed awk高级应用 本节课程将详细介绍sed和awk的高级应用,包括sed的综合脚本应用和awk的基本用法。通过学习本节课程,读者将掌握sed和awk的高级技巧,能够更好地处理文本数据。 一、sed高级应用 sed是一种流...
在这个高级应用实例中,我们看到了如何利用`awk`来整理和格式化捐款记录,生成一个详细的贡献者报告。 首先,原始数据包含了捐款人的姓名、电话号码以及每个月的捐款数额。我们需要对这些数据进行处理,生成一个新...
#### Awk 高级应用 - **条件判断**:使用 `if` 语句进行条件判断。例如 `awk -F ":" '{if ($3 == 0) print $1}' /etc/passwd` 打印具有用户ID为0的用户(通常是 root 用户)。 - **循环结构**:Awk 支持 `for`, `...
在本文中,我们主要探讨了sed和awk两种工具在Linux环境下进行文本处理的各种高级用法,涉及从文件读取数据、字符串处理、字符编码转换和特殊字符替换等多个实用案例。接下来,我们将对各个案例进行详细解析。 首先...
下面是一份 awk 教程,从基础知识到高级应用,涵盖了 awk 的基本概念、语法、函数和应用实例。 awk 基础知识 awk 的基本结构是 pattern{action},其中 pattern 是awk的模式, action 是awk的动作。awk 的模式可以...
awk的常见应用场景是编写小型工具,它们解决特定问题,通过Shell的管道功能组合起来解决更大问题。这种解题方式允许灵活重组和重用小工具,也可以用于快速验证大型程序原型,如果需要更高性能,可以之后用C语言重写...
- **sed 和 awk 高级应用**:掌握sed和awk的高级用法,实现复杂的数据处理需求。 - **调试技巧**:学习如何调试Shell脚本,包括设置断点、查看变量值等技巧。 - **实战案例分析**:通过实际案例加深对所学知识的理解...
### 知识点概述 **sed和awk工具的介绍与应用** sed和awk是广泛应用于UNIX系统中的两...通过本书的学习,用户可以掌握sed和awk的基础知识和高级应用,并能够将这些工具应用于日常的工作中,以提高处理文本数据的效率。
awk高级特性 - **BEGIN和END规则**:BEGIN规则在处理输入文件之前执行,END规则在处理完所有文件后执行。 - **内置变量**:如NR(已读取的行数)、NF(当前行的字段数)、FS(字段分隔符)等。 - **函数**:awk...
5. **高级技巧**:讲解AWK的高级特性,如自定义记录格式、多维数组、条件表达式以及错误处理。这些技巧可以帮助开发者编写更复杂和高效的AWK程序。 6. **实际应用示例**:书中包含大量实用示例,覆盖了数据分析、...
- **高级应用案例**:通过构建复杂的AWK脚本,可以实现诸如数据分析、统计报告生成等高级功能。 综上所述,AWK不仅是一种功能强大的文本处理工具,也是一种易于学习且功能丰富的脚本语言。掌握了AWK的基本使用方法...
### AWK在报表和数据库中的应用 AWK可以用来生成报表和处理数据库查询。它支持简单的报表生成,以及更复杂的数据库风格的报表和查询。 ### AWK在文本处理中的高级技巧 AWK能够生成随机文本,实现交互式文本处理,...
**一.11 AWK高级输入输出** AWK可以使用`getline`命令从其他文件或管道中读取数据,以及使用`print`和`printf`进行复杂的输出格式化。 **一.12 AWK与SHELL SCRIPT混合编程** AWK脚本可以嵌入到shell脚本中,与其他...
#### 五、awk的应用场景 1. **日志分析**: - awk非常适合处理日志文件,提取关键信息,如IP地址、访问时间等。 2. **数据提取**: - 从复杂的数据文件中提取所需字段,用于进一步分析。 3. **报告生成**: - ...