原文链接:http://www.zsythink.net/archives/1374
awk是一个报告生成器,拥有强大的文本格式化的能力。可以把报告理解成“报表”或“表格”。利用awk的“文本格式化能力”将一些文本整理成我们想要的样子。
awk基本语法:awk [options] 'Pattern{Action}' file
从字面上理解 ,action指的就是动作,awk擅长文本格式化,并且将格式化以后的文本输出,所以awk最常用的动作就是print和printf,因为awk要把格式化完成后的文本输出啊,所以,这两个动作最常用。
$0 表示显示整行 ,$NF表示当前行分割后的最后一列($0和$NF均为内置变量)
还可以添加字段,与文件中的列结合起来,如下图
AWK包含俩种特殊的模式:BEGIN 和 END。
BEGIN:指定处理文本之前需执行的操作。
END:指定处理完所有行之后需要执行的操作。
输入分隔符
输入分隔符比较容易理解,当awk逐行处理文本的时候,以输入分隔符为准,将文本切成多个片段,默认使用空格,但是,如果一段文字中没有空格,我们可以指定以特定的文字或符号作为输入分割符,比如下图中的例子,我们指定使用"#"作为输入分隔符。
使用 -F# 分割
除了使用-F选项指定的输入分隔符,还可以设置内部变量的方式,指定awk输入分隔符:-v FS='#'
输出分隔符
awk默认的输出分隔符是空格,但也可以通过内置变量OFS设置输出分隔符,-v OFS="+++"
awk变量
FS:输入字段分隔符, 默认为空白字符
OFS:输出字段分隔符, 默认为空白字符
NF:number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量
NR:行号,当前处理的文本行的行号。
awk处理多个文件的时候,如果使用NR显示行号,那么,多个文件的所有行会按照顺序进行排序。
FNR:各文件分别计数的行号
想要分别显示两个文件的行号,该怎么办呢,这个时候就会用到内置变量FNR,效果如下。
RS:输入记录分隔符(输入换行符), 指定输入时的换行符
让awk以为每次遇到一个空格就是新的一行。那么我们该怎么做呢?示例如下
ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符
FILENAME:显示当前文件名
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数
自定义变量
方法1:-v varname=value 变量名区分大小写
方法2:在program 中直接定义,但注意,变量定义和动作之间需要 “;” 分割
还可以使用下面方式