1.域的概念是什么,分隔符到底分隔的是什么
如果分割后的域里面的内容不全是所需要的
比如域1里面是
<mybatis>testStr1></mybatis>
<mybatis>testStr2></mybatis>
sddd
要想得到testStr,可以用两次awk:
awk -F '<mybatis>' '{if($2==""){ print "error"} else{ print $2}}' data.txt | awk -F '><' '{print $1}'
testStr1
testStr2
error
注意:, if($2=="")里面没有空格
2. 语法结构:
查看man awk里面有一句话很好:
An AWK program is a sequence of pattern {action} pairs and user function definitions.
last -n 6|awk '/^wis/{print $1,$4} /^wis2/{print $1,$4}'
如果写在文件里面,可以看的更明白
BEGIN{
}
{
print "匹配0";
}
/wis/{
print "匹配到wis:"$1;
}
/pts/{
print "匹配到pts:"$2;
}
/pts*4$/{
print "匹配到pts*n4";
}
1{
print "test for expretion";
}
#在END之前,把每一行当成一个字符串去匹配,而不是用域的值去匹配,所以pts*4$会匹配结果为0
END{
print "/bash/awk/test"
}
还有,partern是什么?
BEGIN
END
expression
expression , expression
expretion可以是:
逻辑表达式--不用再用if去判断
正则表达式:把每一行当成一个字符串去匹配,而不是用域的值去匹配正则表达式参考:http://www.jb51.net/article/42989.htm
3. 调用awk的方式
1.命令行方式
awk [-F field-separator] 'commands' input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
2.shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh
可以换成:#!/bin/awk
3.将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
其中,-f选项加载awk-script-file中的awk脚本
原则:
帮助文档里面这样说的:
Short programs are entered on the command line usually
enclosed in ' ' to avoid shell interpretation. Longer programs can be
read in from a file with the -f option.
简单归纳下就是:
如果是简单的分析,或者通用性不高的情况下,直接在命令行下就行,一些shell脚本里面经常看到awk的命令行
如果是通用行比较高,重复使用的概率大,或是分析数据的逻辑比较复杂,那选择第三种方式好了.
至于第二种,类似于shell脚本的执行,所以要自动执行的情况下,就考虑这种
4.其他内容
任何一个编程语言,感觉很多东西都是类似的,只是一些细小的规则可能不一样,
比如,肯定少不了用户自定义变量,自定义函数,数组,内置的变量/函数...
变量
There are two basic data types, numeric and string.
其中,对于字符串变量,涉及一些转义的知识
输入:
awk '{print "this is a test for \\ and \" and.\n"}'
结果:
this is a test for \ and " and.
数组
提供的是一维的数组,没有2维!
Array elements are expressed as
array[expr]. Expr is internally converted to string type, so, for
example, A[1] and A["1"] are the same element and the actual index is
"1". Arrays indexed by strings are called associative arrays.
控制语句
控制语句是学习C的,所以基本一致,非常好理解,比shell好理解N多
为了方便,预定了一些内置变量和内置函数,
东西比较多,直接看man帮助文档,里面写的非常清楚,比什么资料都好
tips:
变量 --和C类似,只是不用定义类型,也不要用var关键字去定义
控制语句 里面的语句只是可以不加分号,也可以加上--感觉加上看着舒服点吧
函数也很像,更像是JS的函数,不用定义返回类型等
基础知识参考:
http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html
http://www.open-open.com/doc/view/e3356f6ef4ea42d6a2c48bd5dce34f38
日志分析demo:
http://blog.csdn.net/teamlet/article/details/38046409