本章大纲:
8.3 awk
awk是一个处理文本的编程语言工具,能用简短的程序处理标准输入或文件、数据排序、计算以及生成报表等等。
在Linux系统下默认awk是gawk,它是awk的GNU版本。可以通过命令查看应用的版本:ls -l /bin/awk
基本的命令语法:awk option 'pattern {action}' file
其中pattern表示AWK在数据中查找的内容,而action是在找到匹配内容时所执行的一系列命令。花括号用于根据特定的模式对一系列指令进行分组。
awk处理的工作方式与数据库类似,支持对记录和字段处理,这也是grep和sed不能实现的。
在awk中,缺省的情况下将文本文件中的一行视为一个记录,逐行放到内存中处理,而将一行中的某一部分作为记录中的一个字段。用1,2,3...数字的方式顺序的表示行(记录)中的不同字段。用$后跟数字,引用对应的字段,以逗号分隔,0表示整个行。
8.3.1 选项
选项 |
描述 |
-f program-file |
从文件中读取awk程序源文件 |
-F fs |
指定fs为输入字段分隔符 |
-v var=value |
变量赋值 |
--posix |
兼容POSIX正则表达式 |
--dump-variables=[file] |
把awk命令时的全局变量写入文件, 默认文件是awkvars.out |
--profile=[file] |
格式化awk语句到文件,默认是awkprof.out |
8.3.2 模式
常用模式有:
Pattern |
Description |
BEGIN{ } |
给程序赋予初始状态,先执行的工作 |
END{ } |
程序结束之后执行的一些扫尾工作 |
/regular expression/ |
为每个输入记录匹配正则表达式 |
pattern && pattern |
逻辑and,满足两个模式 |
pattern || pattern |
逻辑or,满足其中一个模式 |
! pattern |
逻辑not,不满足模式 |
pattern1, pattern2 |
范围模式,匹配所有模式1的记录,直到匹配到模式2 |
而动作呢,就是下面所讲的print、流程控制、I/O语句等。
示例:
1)从文件读取awk程序处理文件
1
2
3
4
5
6
|
# vi test.awk
{print$2}
# tail -n3 /etc/services |awk -f test.awk
48049
/tcp
48128
/tcp
49000
/tcp
|
2)指定分隔符,打印指定字段
1
2
3
4
|