基本语法
awk [opion] 'awk_script' input_file1 [input_file2 ...]
常用option:
- -F fs 使用fs作为输入记录的字段分隔符,默认为环境变量IFS的值
- -f filename 从文件filename中读取awk_script
- -v var=value 为awk_script设置变量
运行方式:
- 把awk的脚本命令直接放在命令中
- 把awk的所有的脚本命令放在一个脚本文件中,然后用-f选项来指定要运行的脚本命令文件
- 将awk_script放入脚本文件并以 #!/bin/awk -f 作为首行,给予该脚本可执行权限,然后在shell下通过键入该脚本的脚本名调用之
awk_script
awk脚本可以由一条或多条awk_cmd组成,对于多个awk_cmd,一个awk_cmd完成后,应该另起一行,以便进行隔。
awk_cmd由两部分组成: awk_pattern { actions }
。
另外,在awk命令中直接使用awk_script时,awk_script也可以被分成多行书写,但必须确保整个awk_script被单引号括起来。
awk命令的一般形式:
awk 'BEGIN{ actions }
awk_pattern1{ actions }
......
awk_patternN{ actions }
END{ actions }'
inputfile
#其中 BEGIN { actions } 和 END { actions } 是可选的。
内建变量
变量 | 描述 |
---|---|
$n | 当前记录的第n个字段,字段间由FS分隔 |
$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 一条记录的字段的数目 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出字段分隔符,默认值与输入字段分隔符一致。 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
运行过程
- 如果BEGIN 区块存在,awk执行它指定的actions。
- awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取)
- awk将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。字段分隔符使用shell环境变量IFS或由参数指定。
- 把当前输入记录依次与每一个awk_cmd中awk_pattern比较,看是否匹配,如果相匹配,就执行对应的actions。如果不匹配,就跳过对应的actions,直到比较完所有的awk_cmd。
- 当一条输入记录比较了所有的awk_cmd后,awk读取输入的下一行,继续重复步骤③和④,这个过程一直持续,直到awk读取到文件尾。
- 当awk读完所有的输入行后,如果存在END,就执行相应的actions。
1)input_file可以是多于一个文件的文件列表,awk将按顺序处理列表中的每个文件。
2)一条awk_cmd的awk_pattern可以省略,省略时不对输入记录进行匹配比较就执行相应的actions。一条awk_cmd的actions 也可以省略,省略时默认的动作为打印当前输入记录,即{print $0} 。一条awk_cmd中的awk_pattern和actions不能同时省略。
3) BEGIN区块和END区块别位于awk_script的开头和结尾。awk_script中只有END区块或者只有BEGIN区块是被允许的。如果awk_script中只有BEGIN { actions } ,awk不会读取input_file。
4) awk把输入文件的数据读入内存,然后操作内存中的输入数据副本,awk不会修改输入文件的内容。
5) awk的总是输出到标准输出,如果想让awk输出到文件,可以使用重定向。
awk_pattern
awk_pattern模式部分决定actions动作部分何时触发及触发actions。
awk_pattern可以是以下几种类型:
一、 正则表达式用作awk_pattern: /regexp/
注意,正则表达式regexp必须被/包起来
awk中正则表达式匹配操作中经常用到的字符:
\ ^ $ . [] | () * //
:通用的regexp元字符+
: 匹配其前的单个字符一次以上,是awk自有的元字符,不适用于grep或sed等?
: 匹配其前的单个字符1次或0次,是awk自有的元字符,不适用于grep或sed等
二、布尔表达式用作awk_pattern,表达式成立时,触发相应的actions执行
① 表达式中可以使用变量(如字段变量$1,$2等)和/regexp/
② 布尔表达式中的操作符:
- 关系操作符:
< > <= >= == !=
- 匹配操作符:
value ~ /regexp/
如果value匹配/regexp/,则返回真 value !~ /regexp/
如果value不匹配/regexp/,则返回真
③ &&
(与) 和 ||
(或) 可以连接两个/regexp/或者布尔表达式,构成混合表达式。!
(非) 可以用于布尔表达式或者/regexp/之前。
④ 其它表达式用作awk_script,如赋值表达式等
取行
NR==1 | 取出某一行 |
NR>=1 && NR<=5 | 取出1到5行 范围 |
/pattern/ | 正则 |
/pattern1/,/pattern2/ | 正则 范围 |
符号 | > < >= <= == != |
取列
- -F 指定分隔符,指定每一列结束标记(默认是空格、连续空格、tab)
- $数字 取出某一列
- $0 表示一整行(所有的列)
- $NF 表示最后一列
同时取行取列
取/etc/passwd的第一行第六列
- ~包含
- !~ 不包含
特殊模式BEGIN{}和END{}
模式 | 含义 | 应用场景 |
---|---|---|
BEGIN{} | 在awk读取之前执行 | 1. 进行简单统计,计算,不涉及读取文件 2. 用来处理文件之前,添加表头 3. 定义awk变量(很少用,一般用-v) |
END{} | 在awk读取文件之后执行 | 1. 进行统计 2. awk使用数组,用来输出数组结果 |
统计/etc/services 里面有多少个空行
计算1到100的和
aek数组
形式 | array[0]=a array[1]=b |
使用 | print array[0] |
批量输出数组内容 | for(i in array) print array[i] i为数组下标,从0开始 |
array[]++ | 数组分类计数 |
处理以下文件内容,将域名取出并根据域名进行计数排序处理:
for循环
for(i=1; i<=10;i++) print i | 可以用来循环每个字段 |
if判断
单分支 | if(条件) print “obj” |
多分支 | if(条件) print "obj1" else print “obj2” |
统计磁盘空间使用率
统计下面字段中,单词中字符小于6的单词,显示出来