(一)简介
1.awk是一种处理文本文件的语言,是一个强大的文本分析工具;
2.常见用法:
log.txt
2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo
(1)用法一:
awk '[pattern] {action}' filenames # '' 只能用单引号例子如下:
# 每行按空格或TAB分割,输出文本中的1、4项 $ awk '{print $1,$4}' log.txt --------------------------------------------- 2 a 3 like This's 10 orange,apple,mongo
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令 #输出 3 Are you
(2)用法二:
awk -F #-F相当于内置变量FS, 指定分割字符
例子:
# 使用","分割 $ awk -F, '{print $1,$2}' log.txt --------------------------------------------- 2 this is a test 3 Are you like awk This's a test 10 There are orange apple
# 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割 $ awk -F '[ ,]' '{print $1,$2,$5}' log.txt --------------------------------------------- 2 this test 3 Are awk This's a 10 There apple
$ awk -F[:,], '{print $1,$2}' log.txt #先用:,再用,分割 --------------------------------------------- 2 this is a test 3 Are you like awk This's a test 10 There are orange apple
(3)用法三:
awk -v # 设置变量例子:
$ awk -va=1 '{print $1,$1+a}' log.txt --------------------------------------------- 2 3 3 4 This's 1 10 11 $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt --------------------------------------------- 2 3 2s 3 4 3s This's 1 This'ss 10 11 10s(4)用法四:
awk -f awk脚本 文件名例子:
$ awk -f cal.awk log.txt
3.awk脚本格式
#!/bin/awk -f
BEGIN { actions } #注意大小写
awk_pattern1 { actions }
............
awk_patternN { actions }
END { actions }
(1)awk把输入文件的数据读入内存,然后操作内存中的输入数据副本,awk不会修改输入文件的内容;
(2)awk将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推;字段分隔符使用shell环境变量FS或由参数指定;整条记录表示为$0;
(3)awk_cmd由两部分组成: awk_pattern { actions } ;
(4)把当前输入记录依次与每一个awk_cmd中awk_pattern比较,看是否匹配,如果相匹配,就执行对应的actions;如果不匹配,就跳过对应的actions,直到比较完所有的awk_cmd;
(5)一条awk_cmd的awk_pattern可以省略,省略时不对输入记录进行匹配比较就执行相应的actions;一条awk_cmd的actions 也可以省略,省略时默认的动作为打印当前输入记录(print $0) ;一条awk_cmd中的awk_pattern和actions不能同时省略;
(6)如果awk_script中只有BEGIN { actions } ,awk不会读取input_file;
(7)例子:
$ cat score.txt Marry 2143 78 84 77 Jack 2321 66 78 45 Tom 2122 48 77 71 Mike 2537 87 97 95 Bob 2415 40 57 62
$ cat cal.awk #!/bin/awk -f #运行前 BEGIN { math = 0 english = 0 computer = 0 printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n" printf "---------------------------------------------\n" } #运行中 { math+=$3 english+=$4 computer+=$5 printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5 } #运行后 END { printf "---------------------------------------------\n" printf " TOTAL:%10d %8d %8d \n", math, english, computer printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR }
$ awk -f cal.awk score.txt NAME NO. MATH ENGLISH COMPUTER TOTAL --------------------------------------------- Marry 2143 78 84 77 239 Jack 2321 66 78 45 189 Tom 2122 48 77 71 196 Mike 2537 87 97 95 279 Bob 2415 40 57 62 159 --------------------------------------------- TOTAL: 319 393 350 AVERAGE: 63.80 78.60 70.00
(二)语法
1.awk_pattern
(1)决定actions部分何时触发;
(2)常见的awk_pattern:正则表达式,布尔运算;
(3)例子:
2.awk_action
(1)对awk读取的记录数据进行的操作;actions由一条或多条语句或者命令组成,语句、命令之间用分号(;)分隔;actions中还可以使用流程控制结构的语句;
(2)常见命令有:print(打印),next(处理下一条记录),nextfile(处理下一个文件),exit(退出);
(3)例子:
3.赋值语句
(1)赋值语句主要有3种:直接赋值,表达式赋值,累加符号(c风格);
(2)例子:
4.流程控制
① if (condition) {then-body} [else {else-body}]
② while (condition) {body}
③ do {body} while (condition)
④ for (initialization; condition; increment) {body}
⑤ break : 跳出包含它的for、while、do-while 循环 ;
⑥ continue : 跳过for、while、do-while循环的body的剩余部分,而立刻进行下一次循环的执行;
5.函数
function fun_name (parameter_list) // parameter_list是以逗号分隔的参数列表
{
body-of-function // 函数体,是awk语句块
}