目录
1.源头学习
awk诞生于 GNU 软件家族:
Software- GNU Project - Free Software Foundation
对于GNU来讲有很多常用的命令,比如grep,sed等。在网站上能找到相关的文档和源码
GNU使命明确,给于用户已足够的自由,代码文档学习和修改等非常自由
可以查看 awk 官方文档
作者在文档中写了以下抒情诗,这里表示膜拜下
2.用武之地
awk自己以前主要用于在服务器和大数据方面的分析,处理,统计
大型服务器集群的访问日志等分析处理
大数据的统计和排序,特定条件的过滤分析等
数据规则化过滤生成图表等
3.实践说明
awk工作的基本流程
- 读取文件内容
- 通过分隔符逐行分析,分解出每行的每个字段
- 按照匹配规则处理相关字段
- 输出预定结果到指定文件
awk命令格式
awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ... ]
参数说明:
- -F field-separator 对每行字段解析的分隔符,一般是 空格
- -v 定义变量
- prog 匹配的pattern+action
- -f 如果prog过长可以写入到一个脚本文件里面
- file... 可以同时处理多个文件
举例:
awk -F ',' '/prog_pattern/ { print "prog_action" }' files-mail-list
3.1 program(prog)详解
awk 'program' input-file1 input-file2 ...
可以由多个 pattern { action } pattern { action } ... 组成
先说明两个文件 以便后面写例子
文件1 mail-list
Amelia 555-5553 amelia.zodiacusque@gmail.com F
Anthony 555-3412 anthony.asserturo@hotmail.com A
Becky 555-7685 becky.algebrarum@gmail.com A
Bill 555-1675 bill.drowning@hotmail.com A
Broderick 555-0542 broderick.aliquotiens@yahoo.com R
Camilla 555-2912 camilla.infusarum@skynet.be R
Fabius 555-1234 fabius.undevicesimus@ucb.edu F
Julie 555-6699 julie.perscrutabor@skeeve.com F
Martin 555-6480 martin.codicibus@hotmail.com A
Samuel 555-3430 samuel.lanceolis@shu.edu A
Jean-Paul 555-2127 jeanpaul.campanorum@nyu.edu R
文件2 inventory-shipped
Jan 13 25 15 115
Feb 15 32 24 226
Mar 15 24 34 228
Apr 31 52 63 420
May 16 34 29 208
Jun 31 42 75 492
Jul 24 34 67 436
Aug 15 34 47 316
Sep 13 55 37 277
Oct 29 54 68 525
Nov 20 87 82 577
Dec 17 35 61 401
Jan 21 36 64 620
Feb 26 58 80 652
Mar 24 75 70 495
Apr 21 70 74 514
执行的一个例子:
从mail-list文件里面匹配包含 li 两个字母的条目, 然后打印匹配行的所有内容 $0 表示行的所有内容 ,$1, $2, $3 ..... 表示通过分隔符解析后的第一个字段,第二个字段,第三个字段 ... 如 第一个行 $1 = "Amelia" , $2 = "555-5553",
其中这里面pattern = /li/ action = {print $0}
3.1.1 pattern详解
主要用一下几种类型
- 正则表达式 /regular expression/ 以 // 区分
- 单个表达式 expression, 非0或者非空为匹配
- 范围匹配 begpat, endpat 匹配到begin pattern之后,所有的动作到end pattern结束
- 开始和结束定制 BEGIN END 在文件分析之前和之后的行为
regular expression
符合一般的正则表达式基本都可以
例子: /foo|bar|baz/ { buzzwords++ }
expression
表达式可以包含各种逻辑运算符等
例子:
awk '$1 == "li" { print $2 }' mail-list #第一个字段等于li
awk '$1 ~ /li/ { print $2 }' mail-list #第一个字段包含li
awk '$1 !~ /li/ { print $2 }' mail-list #第一个字段不包含li
awk '/edu/ && /li/' mail-list #包含edu和li
begpat, endpat
范围匹配
例子:
awk '$1 == "on", $1 == "off"' mail-list #第一个字段on到第一个字段off
awk '$1 == "Bill", $1 == "Martin"' mail-list #结果如下
Bill 555-1675 bill.drowning@hotmail.com A
Broderick 555-0542 broderick.aliquotiens@yahoo.com R
Camilla 555-2912 camilla.infusarum@skynet.be R
Fabius 555-1234 fabius.undevicesimus@ucb.edu F
Julie 555-6699 julie.perscrutabor@skeeve.com F
Martin 555-6480 martin.codicibus@hotmail.com A
BEGIN END
在匹配文件之前和之后执行的操作
例子:
awk 'BEGIN { print "Analysis of \"li\"" } /li/ { ++n } END { print "\"li\" appears in", n, "records."}' mail-list #结果如下
Analysis of "li"
"li" appears in 4 records.
说明:n为自定义变量,总共3个匹配和动作
BEGIN { print "Analysis of \"li\"" } #分析之前的动作
/li/ { ++n } #逐行分析的动作
END { print "\"li\" appears in", n, "records."} #分析完之后的动作
3.1.2 action详解
动作以{} 区分, 功能很强大,可以定义变量,加入if,for,while等控制语句,有内置函数也可以自定义函数等,主要介绍2种类型:
- 一般表达式 Expressions
- 控制复合语句 Control / Compound statements
Expressions
一般打印输出,变量计数等
例子:
awk 'length($0) > 80 {print $0}' mail-list #一行的字数大于80,打印
awk 'length($0) > 80 {word80++}' mail-list #一行的字数大于80,计数
Control / Compound statements
可以有if else for等程序化语句,可以有函数等或自定义函数和程序语句
例子:
awk '{ if (length($0) > max) max = length($0) } END { print max }' mail-list #计算最长行的字数
awk '{ if (length($0) % 2 == 0) print "word is even"; else print "word is odd"}' mail-list #if-else语句,计数字数奇偶性
awk ' { i = 1; while (i <= 3) { print $i ;i++ } }' inventory-shipped #while语句
awk ' { for (i = 1; i <= 3; i++) print $i }' inventory-shipped #for语句
说明:length是内置的字符串函数,控制语句类似c语言里面的语法,注意分号
4.相关资料
更多语法和用法,参考GNU官网
5.源码
参考GNU官网