1 awk的调用可以定义变量,提供程序并且指定输入文件。 2 Awk [ -F fs ]
[ -v var=value …] ‘program’ [ --- ]\ [ var=value …
] [ file(s) ] Awk [ -F fs ] [ -v
var=value …] –f programfile [ --- ]\ [ var=value …
] [ file(s) ] A. 短程序直接在命令行上提供,长的程序以-f项指定。 B. --是特殊选项,指出awk本身已没有进一步的命令选项,任何接下来的选项都被你的程序使用。 C. -F 用来重新定义默认字段的分隔字符。分隔字符也可以使用内建变量FS指定。 awk –F ‘\t’
‘{…}’ files FS=”[\f\v]” files D. –v选项必须放在命令行上直接给定的任何程序之前,它们会在程序启动之前以及处理文件之前生效。 3 awk程序模型。 A. awk把输入流看作一连串的记录的集合,一行一条记录,每条记录再分为字段。 B.一个awk程序是一对以模式与大括号框起来的操作组合而成的。模式与操作可省略其中一个,如模式省略,则操作将被应用到每条输入记录。如果操作省略,则默认操作是打印匹配记录到标准输出上。 Pattern { action } Pattern { action } C. BEGIN
与END ,BEGIN模式对应的操作只在-v选项完成后执行一次,通常BEGIN放到各种操作之前,END模式对应的操作在所有数据已被处理完成后执行,只执行一次,END通常放到最后。 4 程序元素 (1)
两个连续的字符串会自动连接到一起。 (2)
将数字转换为字符串,通过数字连接空字符串便可:n=123, s = “” n (3)
awk 功能强大的地方来自于它对正则表达式的支持。~ 匹配,!~ 不匹配。 “ABC” ~ “^[A-Z]+$” 结果为真。 (4)正则表达式常量可以用引号或斜杠来定界。注意转义:”\\\\Tex” 与/\Tex/
都匹配包含\Tex的字字符串表达式。 (5)
字符串转换成数字。加个零到字符串就可,s = “ “+123ABC”转成123,
“ABC (6) 5 内建变量 FILENAME当前的输入文件名 FNR 当前的输入文件记录数。 FS 字段分隔字符 NF当前记录的字段数 NR在工作中的记录数 OFS输出字段分隔字符 ORS输出记录分隔字符 RS 输入记录分隔字符(仅用gawk, mawk) 6 字段 字段可以以特殊名称$0, $1, $2, … $NF供awk程序使用。$0引用当前的记录。记录分隔符不是记录的一部分。 7 awk里的单行程序。 (1) awk '{ C += length($0) + 1 ; W+= NF} {print NR, W, C }' 统计记录数输入的行数与总工的字节数。 (2) awk '{print $2, log($2) }' test2.txt 打印第2栏的值与其对数值。 (3) awk -v COLUMN=2 ' { sum += $COLUMN } {print sum} ' test2.txt报告第2栏的值,注意栏就是列的意思。 (4) awk '/main/ { print FILENAME ":" FNR ":" $0}' * 用AWK查找字符。然后打印出文件名所在和行与当前记录,也就是当前行内容。 (5) awk 'BEGIN { FS = "#"; OFS = "&" } { $2 = $2 ;print }' test3.txt > test4.txt 开始时指定#为记录中的字段分隔符,指定&为输出记录的字段分隔符。 8 语句 (1)连续执行。 多条语句写在一行上用分号隔开,或是一个语句一行。 (2)条件执行。 if( expressino) Statement else Sssss
(3) 重复执行。 A, while(express) statement B, do statemetnt while(expresss) C, for(exp1;
exp2; exp3) statement D, for(
key in arrary) statement 用来反复处理数组里的元素。 可以使用break,
continue. 9 数组成员。 引用元素时如果元素不存在则会建一个元素。测试是应这样写if( “sally” in telArry)而非if( telArry[“sally”]
!= “”); 10 用户控制输入 getline 11 执行外部程序 有三种方式 (1)
getline语句通过管道外部程序通信。使用完管道后要用close()关闭。 (2)
输出重定向与外部程序通讯。使用完文件后要用close()关闭。 (3)
system(command)。这个在system返回前会自动关闭所用的文件或管道。 12 用户定义函数。 (1)函数可以定义在程序顶层的任何位置:成对的模式/操作之前,之间,之后。惯例是放在后面。 (2)调用时函数名与括号之间不能有空格。 (3)标量为传值,数组为传引用,函数里可以更改数组中的值。 (4)函数返回值不是零就是空字符串。 (5)所有用在函数体内而在参数中没有出现的变量都认为是全局的。调用时传入的参数可以比定义的少,多余的参数视为局部变量。 13 字符串函数 (1) 子字符串提取 substr(string, start, len ) 返回一个由string的start字符开始,共len个字符长度的子字符串副本。字符位置从1开始编号, 参数超出范围得到一个空串。 (2) 字符串长度 length( string ) (3) 字母大小写转换 tolower(string), toupper( string ) tolower(“aBcDeF (4) 字符串查找。 index( string, find ), 在string里查找find, 然后返回string里find字符串的起始位置,如果找不到就返回0,注意字符位置从1开始。 index( tolower(string), tolower(find))可以在查找时忽略大小写。 index只会找出第一个出现的字符串,要找最后一个的话没有标准的函数,下面这段程序可以完成这个功能。 function rindex( string, find, k, ns, nf ) { ns = length(string) nf = length(find) for( k = ns + 1-nf; k>=1; k--) if( substr(string, k, nf) == find) return k return 0 }
(5) 字符串匹配 match(string, regexp)将string与正则表达式regexp匹配,如果匹配就返回匹配string的索引,不匹配就返回0. (6) 字符串替换 sub( regexp, replacement, target) gsub(regexp, replacement, target) (7) 字符串分割。 A awk 对当前记录$0自动进行了分割,$1, $2,$3 $NF. B 可以用函数来做上面的分割。split( string, array, regexp ) regexp将string切割为片段,并存在array里,如果将第三个参数省略则用FS当成分隔符。数组从1开始。 A split( $0, parts, “:”)以冒号分隔。 B split(string, chars, “”)分隔符没有空格,就是把string分隔成单字节存放在chars数组中。 C split(“”, array ) 删除array里的所有元素。 (8) 字符串重建 awk没有提供标准的重建函数,但可以通过下面的程序实现。 function join(array, n, fs, k, s ) { #重新组合arrary元素为一字符串 #以fs为分隔 if( n >= 1 ) { s = array[1] for( k = 2; k<=n; k++) s = s fs array[k] } return (s) } 14 数值函数 |
|