AWK使用笔记

Awk程序运行的方法
1、awk ‘program’ input-file1 input-file2 … #这种方式适用于短的程序
2、awk -f program-file input-file1 input-file2 …
其中’program’由一系列的模式和行为组成
在awk的语法中,模式或行为都可以被省略,但是不能两个都被省略。如果模式被省略了,行为将会针对每一行。如果行为被省略了将会执行默认行为(即打印所有匹配到模式的行)。
简单的例子:
AWK使用笔记

转义字符的使用:
\ 字符“\”
\a 警告字符(ctrl+g,ASCII码为7(BEL))
\b 退格,ctrl+h,BS
\f Formfeed, ctrl+l, FF
\n 新行,ctrl+j, LF
正则表达式的符号
符号
用途

转义字符,用于匹配特殊字符
^
用于匹配字符串的开头部分,并不匹配字符串中间的\n
if (“line1\nLine2” ~ /^L/) … 条件的结果为false
$
与^类似,只不过是用来匹配一行的结尾
.
匹配任意单个字符,包括\n
[…]
字符列表,匹配[]内的任意字符
[^…]
完全字符列表,匹配方括号里面字符的所有字符,其中[与^之间没有任何字符
|
选择符号,在正则表达式中是最低优先级
(…)
用于给正则表达式分组,
@(samp|code){[ˆ}]+}匹配@code{foo} 和 @samp{bar}
*
符号前面的表达式可以重复任意次
+
类似,不过只匹配前面的表达式至少出现一次的情况
?
类似,只不过只匹配最多一次出现的情况
{n}, {n,}, {n,m}
匹配前面的正则表达式重复n次的情况
{n} 出现n次
{n,}出现至少n次
{n,m}出现n到m次
[:alnum:] 字母数字字符
[:alpha:] 字母字符
[:blank:] 空格和tab字符
[:cntrl:] 控制字符
[:digit:] 数字字符
[:graph:] 可打印和可视字符,空格是可打印字符但是是不可见的
[:lower:] 小写字符
[:print:] 可打印字符
[:punct:] 标点符号
[:space:] 空白符号
[:upper:] 大写字符
[:xdigit:]1 6进制字符
在POSIX awk和gawk中,如果*,+,?前面没有任何字符,那么他们就代表它们自己。

gawk中特有的正则表达式操作
AWK使用笔记

匹配空字符串出现在两个单词组成的字符之间的情况。与\y相反
不区分大小写的匹配
1、使用正则表达式 [wW]实现
2、使用tolower($1) ~ /foo/ {…},或者使用toupper()
3、设置内置变量IGNORECASE (0:区分大小写 ,否则不区分大小写)
匹配多少次
以echo aaaabcd | awk '{ sub(/a/, “”); print}’为例
awk正则表达式总是匹配输入字符串最左边的、最长的符合匹配条件的字符串
动态正则表达式
~ 或者 !~ 操作的右边不能是正则表达式变量
使用正则表达式变量进行匹配的方式成为动态正则表达式。例子:BEGIN { digits_regexp = “[[:digit:]]+”} $0 ~ digits_regexp {print}
/*/表示字符“”的正则表达式,但是如果写成字符串形式要写成“\

awk的函数
内置函数
主要分为三类:数字函数、字符串处理和IO函数
gawk提供了额外的关于时间、位操作等程序。
内置函数调用的方式:atan2(y+z, 1) 其中函数名与圆括号之间的空白会被忽略,但是一般情况下书写应该不带空白。
当函数被调用的时候,入参列表的额表达式都是已经被计算之后的返回结果。如:i=4; j = sqrt(i++) 其中sqrt的入参为5。入参列表表达式被执行的顺序是未被定义的。
数值函数
int(x) 返回最靠近x的整数,向0取整
sqrt(x) 返回x的正平方根。如果x为负数,gawk将会报告错误
exp(x) 返回e^x,如果x超出范围将会报告错误。x的范围取决于机器的浮点表示
log(x) 返回x的自然对数
sin(x) 返回x的正弦值,x以弧度为单位
cos(x)
atan2(y,x)
返回y/x的反正切值,以弧度为单位
rand() 返回(0,1)内满足均匀分布的随机数,
srand([x]) 为随机数设置开始点或者种子。每个种子对应一组随机数序列

-F fs 指定描绘一行中数据字段的文件分隔符
-f file 指定读取程序的文件名
-v var=value 定义gawk程序中使用的变量和默认值
-mf N 指定数据文件中要处理的字段的最大数目
-mr N 指定数据文件中的最大记录大小
-W keyword 指定gawk的兼容模式或警告级别

gawk的主要功能之一是其处理文本文件中数据的能力。它通过自动将变量分配给每行中的每个数据元素实现这一功能。默认情况下,gawk将下面的变量分配给在文本行中检测到的每个数据字段:
◆ $0表示整行文本
◆ $1表示文本行中的第一个数据字段
◆ $2表示文本行中的第二个数据字段
◆ $n表示文本行中的第n个数据字段
各数据字段依据文本行中的字段分隔符确定。gawk读取一行文本时,使用定义的字段分隔符描述各数据字段。gawk的默认字段分隔符是任意空白字符(如制表符或空格符)
BEGIN关键字是在处理任何数据之前应用的命令,即执行该gawk命令行时首先会去执行BEGIN所指定的命令,这里是print “HelloWorld!”,接下去{print $0}是我们输入的数据,输入之后回车会立刻显示相应的内容,也就是我们输入的内容,直到按ctrl-D,然后该gawk命令接结束了,但是结束之后还要之END后的结尾命令{print “byebye”}。这样整个过程就结束了。