AWK学习笔记
目录
简介
awk
是Unix环境下用于格式化文本,并按一定条件进行筛选显示的工具。awk
以发展这种语言的人Aho.Weninberger和Kernigham命名。
基本使用方法
格式
- 基本格式和说明:
awk [-F filed -separator] 'commands' input-files
;-F
为可先项,后跟间隔符,默认以空格为间隔符;commands
为awk命令,包含模式和动作,如BEGIN
和END
模式,动作需要包含在{}
中,最常用的有{print $0}
;input-files
为输入的文本所在的文件。
调用方式
- 有三种方式可以调用
awk
:
- 在命令行中直接执行
awk
命令 - 将
awk
命令写入文件,在shell环境下执行该文件 - 将
awk
命令的commands
部分写成awk脚本
文件,通过-f
选项调用awk脚本
,如下所示:
awk -f awk-script-file input-files
- 在命令行中直接执行
命令部分的构成
'[模式] {动作}'
BEGIN
模式:为模式部分使用的关键字,用于表示在读取输入文本之前所做的动作。END
模式:用来在awk
完成文本浏览动作后打印输出文本总数和结尾状态标志。awk
中将文本用域进行标识,域标记为$1,$2...$n
,$0
则表示所有域print
动作:在commands
awk命令中使用,且因为是动作,所以需要包含在'{}'
中,print
之后跟的是需要输出的内容,可以按照一定的格式对域标记进行组合,如:awk {print $1"\t"$3}' input-files
- 输出重定向:
- 重定向符号’>’,可将执行的输出重写到文件中,++但不会输出在屏幕++,且文件会被重写,可使用’>>’,则会从文件尾开始输入。
- 还可使用
tee
命令,也是将输出重写到文件中,但有个好处是++可以输出到屏幕++,如果用-a
参数则可以从文件尾开始输入。
示例
awk 'BEGIN {print "field1\t|field2\n--------------------"} >{print $1"\t|"$2}END{print "succ end"}' input-files
input-files
文件中的内容:a1 a2 a3 b1 b2 b3
结果:
field1 |field2 -------------------- a1 |a2 b1 |b2 succ end
使用技巧(待补充)
定义多个分隔符,比如想要以‘()’作为分隔对文本‘name(lisa)’可以写为:
awk -F'[()]' '{print $2}' input-files
结果为:lisa
正则表达式(待补充)
- 条件操作符
操作符 | 描述 | 用法 |
---|---|---|
< | 小于 | {if($1 < $2) print $0} |
> | 大于 | {if($1 > $2) print $0} |
<= | 小于等于 | {if($1 <= $2) print $0} |
>= | 大于等于 | {if($1 >= $2) print $0} |
== | 等于 | {if($1 == $2) print $0} |
!= | 不等于 | {if($1 != $2) print $0} |
~ | 匹配 | {if($1~ /aa/) print $1} |
!~ | 不匹配 | {if($1!~ /aa/) print $1} |
2. 复合操作符
操作符 | 描述 | 用法 |
---|---|---|
&& | 与 | {if($1~/bb/ && $2~/aa/) print $0} |
|| | 或 | ``{if($1~/bb/ || $2~/aa/) print $0} |
! | 非 |
字符集(待补充)
- 字符集:
\ / ^ $ . [] & | () * + - ? % !
符号 | 描述 |
---|---|
\ | 转意字符 |
/ | 匹配符 |
^ | 表示行首或域首 |
$ | 域标识符 |
. | 占位符 |
[] | 单字符包含匹配 |
| | 或 |
() | 条件 |
* | ? |
+ | 匹配一个或多个字符 |
? | 出现频率 |
awk
内置变量(待补充)
变量符 | 描述 |
---|---|
ARGC | 命令行参数个数 |
ARGV | 命令行参数排列 |
ENVIRON | 支持队列中系统环境变量的使用 |
FILENAME | awk浏览的文件名 |
FNR | 浏览文件的记录数 |
FS | 设置输入域分隔符,等价于命令行- F选项 |
NF | 浏览记录的域个数 |
NR | 已读的记录数 |
OFS | 输出域分隔符 |
ORS | 输出记录分隔符 |
RS | 控制记录分隔符 |
awk
内置函数(待补充)
函数名 | 描述 |
---|---|
gsub(x,y) | 在每条记录中用y替代x |
gsub(x,y,z) | 在整个z中用y替代x |
index(x,y) | 返回x中字符串y的第一位置 |
length(x) | 返回x长度 |
match(x,y) | 测试x是否包含匹配y的字符串 |
split(s,a,fs) | 在fs上将s分成序列a |
sprint(fmt,exp) | 返回经fmt格式化后的exp |
sub(x,y,z) | 在z所示的域中用y字符串代替x表达式匹配的子串 |
substr(s,p) | 返回字符串s中从p开始的后缀部分 |
substr(s,p,n) | 返回字符串s中从p开始长度为n的后缀部分 |
printf(fmt,s,…) | 格式化输出字符串s,可以有多个s参数 |
awk
转意字符(待补充)
- 可以通过使用
‘\’
来对特殊字符进行转意,如果字符串中需要显示{
,则可以使用'\{'
。
参考资料
[1]: 《SHELL编程入门》:第9章 AWK介绍;
[2]: 《UNIX? Shells by Example Fourth Edition》:Chapter 6;
[3]: 【UNIX/LINUX 系统操作手册】:[man awk];