0. Awk 有三个不同的版本 awk,nawk 和 gawk ,未作特别说明,一般指 gawk 。
1. Awk 语言的最基本功能是在文件或字符串中基于指定的规则来分解抽取信息,也可以基于指定的规则来输出数据。完整的 awk 脚本通常用来格式化文本文件中的信息。
2. 三种方式调用 awk
1) awk [option] ‘awk_script’ input_file1 [input_file2…]
awk 的常用选项 option 有:
-F fs :使用 fs 作为出入记录的字段分隔符,如果省略该选项, awk 使用环境变量 IFS 的值
-f filename :从文件 filename 中读取 awk_script
-v var=value: 为 awk_script 设置变量
2 )将 awk_script 放入脚本文件并以 # ! /bin/awk –f 为首行 ,给予该脚本可执行权限,然后再 shell 下通过键入该脚本的脚本名调用之。
3) awk [ options ] -f scriptfile var = value file(s)
3. awk 的运行过程
1 ) awk_script 的组成
Awk_script 可以由一条或多条 awk_cmd 组成,两条 awk_cmd 之间一般以 NEWLINE 分隔
Awk_cmd 由两部分组成: awk_pattern{actions}
Awk_script 可以被分成多行书写,必须确保整个 awk_script 被单引号括起来
2) awk 的一般命令形式
awk ‘BEGIN{actions} /
awk_pattern1{actions} /
>awk script
Awk_patternN{actions} /
END{actions} /
‘inputfile
其中, BEGIN{actions} 和 END{actions} 是可选的。
3) awk 的运行过程:
①如果BEGIN区块存在, awk 执行它指定的 actions 。
② Awk 从输入文件中读取一行,成为一条输入记录。(如果输入文件省略,将从标准输入读取);
③ Awk 将读入的纪录分隔成字段,将第 1 个字段放入变量 $1 ,第二个字段放入 $2 ,依次类推。 $0 表示整条记录。字段分隔符使用 shell 环境变量 IFS 或由参数指定。
④把当前输入记录一次与每一个 awk_cmd 中的 awk_pattern 比较,看是否匹配,就执行对应的 actions 。如果不匹配,就跳过对应的 actions ,直掉比较完所有的 awk_cmd 。
⑤当一条输入记录比较了所有的 awk_cmd 后, awk 读取输入的下一行,继续重复步骤③④,这个过程持续,直掉 awk 读取到 文件尾。
⑥当 awk 读完所有的输入行后,如果存在 END ,就执行相应的 actions 。
4) input_file 可以是多于一个文件的文件列表, awk 将按顺序处理列表中的每个文件。
5) 一条 awk_cmd 的 awk_pattern 可以省略,省略时部队输入记录进行匹配比较执行相应的 acitons 。一条 awk_cmd 的 actions 也可以省略,省略时默认的动作作为打印当前输入记录( print$0 )。一条 awk_cmd 中的 awk_pattern 和 actions 不能同时省略。
6) BEGIN 区块和 END 区块分别位于 awk_script 的开头和结尾。 Awk_script 中的只有 END 区块或者只有 BEGIN 区块是被允许的。如果 awk_script 中只有 BEGIN{actions},awk 不会读取 input_file 。
7) Awk 把输入文件的数据读入内存,然后操作内存中的输入数据副本, awk 不会修改输入文件的内容。
8) Awk 的总是输出到标准输出,如果想让 awk 输出到文件,可以使用重定向。
3. Awk_pattern
Awk_pattern 模式部分 决定 actions 动作部分合式触发及触发 acitions 。 Awk_pattern 可以是以下几种类型
1) 正则表达式用作 awk_pattern:/regexp/
① awk 中则正则表达式匹配操作中经常用到的字符: / ^ $ . [] | () *// 通用的 regexp 元字符; + :匹配其前的单个字符一次以上,使 awk 自有的元字符,不适用于 grep 或 sed 等;?:匹配其前的单字符 1 次或 0 次,使 awk 自有的元字符,不适用于 grep 或 sed 等
② 举例: awk’/*/$0/.[0-9][0-9].*/’ input_file
1) 布尔表达式用作 awk_pattern, 表达式成立时,触发相应的 actions 执行。
① 表达式中可以使用变量(如字段变量 $1,$2 等)和 /regexp/
② 布尔表达式的操作符:
关系操作符: < > <= >= = = !=
匹配操作符: value ~/regexp/ 如果 value 匹配 /regexp/ ,则返回真
value !~ /regexp/ 如果 value 不匹配 /regexp/ ,则返回真
举例: awk ‘$2>10{print “ok”}’ input_file
awk ‘$3~ /^d/{print “ok”}’ input_file
③ &&( 与 ) 和 ||( 或 ) 可以连接两个 /regexp/ 或者布尔表达式,构成混合表达式。 !( 非 ) 可以用于布尔表达式或者 /regexp/ 之前。举例 awk ‘/^d/||/x$/{print “ok” input_file
③ 其他表达式用作 awd_script 如 赋值表达式等
Awk ‘(tot+=$6);END{print “total points:”tot”} input_file // 分号不能省略
Awk ‘tot+=$6{print $0}END{print “total points:”tot}’ input_file // 与上面等效
2. actions
/actions 就是对 awk 读取的记录数据进行的操作。 Actions 由一条或者多条命令。参数列表要用分号号(;)分隔。 Actions 中还可已使用流程控制结构的语句。
1) awk 的命令:
① print 参数列表: print 可以打印字符串(加双引号),变量和表达式,是 awk 最基本的命令。参数列表要用逗号(,)分隔,打印出时参数值之间不会有空格。
② printf ( [ 格式控制符 ], 参数):格式化打印命令(函数),语法与 C 语言的 printf 函数类似
③ next : 强迫 awk 立刻停止处理当前的记录,而开始读取和处理下一条记录。
④ nextfile :强迫 awk 立刻停止处理当前的输入文件而处理输入文件列表中的下一个文件
⑤ exit : 使 awk 停止执行而跳出。如果 END 存在, awk 回去执行 END 的 actions 。
2) awk 的语句: awk 的语句只要是赋值语句,用来给变量赋值。
① 把直接值或一个变量值赋值给变量。如果直接值是字符串要加双引号。
举例: awk’BEGIN{x=1;y=3;x=y;print”x=”;y=”y}’
② 把一个表达式的值赋值给变量。表达式一般式数值表达式,也可是其他表达式。
数值表达式: num1 operator num2
Operator 可以是 +( 加 )-( 减 )*( 乘 )% (取余) ^ (求幂)
当 num1 或者 num2 是字符串而逝不是数组时,无论是否加有双引号, awk 都视其值为 0
条件选择表达式 A ? B : C ( A 为不二表达式, B 和 C 可以是表达式或者直接值)
当布尔表达式 A 的值为真时,整个表达式的值为 B , A 的值为假是,整个表达式的值为 C
Awk ‘BEGIN{x=3;y=x>4?”ok”:4;print”x=”;y=”y}’
③为了书写方便, awk 也支持 c 语言语法的赋值操作符: += -= *= /= ^= ++ - -
2) 流程控制结构(基本上是使用 c 语言的语法)
其中 condition 一般为布尔表达式, body 和 else-body 是 awk 语句块。
① if ( condition ) {then-body}[else{else-body}]
② while(condition){body}
③ do{body}while(condition)
④ for(initialization;condition; increment) {body} 与 c 语言的 for 结构相同。
⑤ break 和 continue