Linux Awk notes
1. awk语言
www.zhishiwu.com
awk是用来操作数据和产生报表的一种编程语言。
awk从第一行到最后一行逐行扫描一个文件,搜索与指定模式匹配的行,并对这些行执行选定的操作(操作封装在花括号里)。
awk指令包括模式、操作或模式和操作的组合。
awk模式控制awk对一行输入作什么样的操作;包括正则表达式,可以产生布尔值的表达式,或两者的结合。awk支持的正则表达式与egrep基本一致;也可以用 & >在替代串里表示搜索串里匹配到的字符串。
awk操作是封装在花括号里且由分号分隔的语句(语句如果在各自的行里,也可用换行符分隔)。awk支持print和printf格式化输出,其中printf格式化字符与C语言中的格式化字符其本一致。print提供换行符,printf不提供,换行时需要提供转义序列/n。
2. awk内置变量
内置变量名称大小,可以用在表达式里面,且可以被重置。
www.zhishiwu.com
变量名 变量含义
ARGC 命令行变量个数
ARGV 命令行变量数组
FILENAME 当前输入的文件名
NF 当前记录的域个数
NR 到目前为止所有输入文件的记录数
FNR 到此为止当前文件的记录数
FS 输入域分割符,默认为一个空格。也可以在命令行通过 -F 选项指定输入域分割符
OFS 输出域分割符
RS 输入记录分割符
ORS 输出记录分割符
OFMT 数值输出格式;printf格式化输出时也可指定数值输出格式
SUBSEP 下标分割符,可用于实现多维数组
RLENGTH 由match函数匹配的串长度
RSTART 由match函数匹配的串偏移量
3. BEGIN,END模式 www.zhishiwu.com
BEGIN模式后跟一个操作模块,在awk处理文件之前执行该模块。
BEGIN操作通常用来改变FS、RS、OFS等内置变量的值,或给用户自定义变量赋初值,把标题打印成输出的一部分等。
eg: awk 'BEGIN{FS=":"; OFS="/t"}{print $1,$2}' filename
END模式不与任何输入行匹配,只执行与END模式相关的操作。在awk将所有输入行处理完后,才会执行END模块。
eg: awk 'END{print "The number of records is " NR}' filename
4. awk内置函数
getline
getline函数用来从标准输入、管道、或文件读输入,而不是从正被处理的当前文件。
eg: awk 'BEGIN{"date" | getline dt; print dt}' filename
system
system函数将一个shell命令当作它的变量,执行该命令,并把退出状态返回给awk。
sub和gsub
sub函数把正则 表达式与记录里最大且最左边的字符串匹配,然后用替换串替换该字符串。sub将目标字符串(eg: $1)作为第三个参数,可选;如果没指定目标串,默认使用整条记录。
gsub函数全局替换记录里正则表达式的每次匹配。 sub (regular expression, substitution string[, target string]) gsub (regulat expression, substitution string[, target string])
index
index函数返回在一个字符串里找到子串的第一个位置,偏移量从1开始
index (string, substring)
length
length函数返回一个字符串的字符数;如果没有变量,就返回一条记录里的字符数。
length [(string)]
substr
substr函数返回从第一个位置开始的字符串的一个子串;这里第一个位置是1。 substr (string, starting position[, length of string])
match
match函数返回字符串里找到正则表达式位置的索引;如果没找到,返回0。
match函数将内置变量RSTART设置为子串的起始位置,设置RLENGTH为到子串末尾为止的字符数。
match (string, regular expression)
split
split函数把字符串划分为一个数组。split将域分割符作为第三个参数,可选;如果没提供,则默认使用当前FS值。
split (string, array[, field separator])
sprintf
sprintf函数以指定格式返回一个表达式,允许使用printf的格式说明。
int
int函数舍去小数点后任何数位来创建一个整数。
rand
rand函数产生一个大于或等于0且小于1的伪随机数。
srand
srand没有参数,就用日期产生rand函数的种子;srand(x)将x作为种子。