awk 小结

awk 的功能非常强大,它是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出 (屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。

awk 有多个内置变量,下面我们以几个常用的内置变量来学习一下awk。

1.awk会将正在处理的文件名放在一个内置变FILENAME里,这是我们在脚本中提取文件名非常的方便。FS 是字段分割符(默认为空格),OFS是输出字段(默认为一个空格),它的格式是 –v FS=:能用 –F : 指提取文件时以:段分割符,–v FS=+++++ 指输出时以++++为段分割符

clip_image002

clip_image004

clip_image006

为了实验方便,我们现在把passwd shadow 的前8行追加到两个文件中

clip_image008

clip_image010

clip_image012

2 在awk中 NF 显示段数,可以使用 ‘{print $NF }’ 打印文件一列, $(NF -1) 倒数第二段。

clip_image013

clip_image015

3 FNR 当前文件所处理的行号,NR 若处理多个文件,就把所以文件数相加,累加显示

clip_image017

4 RS 默认的换行符 ORS 定义输出换行符

clip_image019

clip_image021

5 awk 支持正则表达式,匹配表达式,关系表达式

关系表达式:可以对关系运算符进行操作,可以是字符串或数字的比较,如$2>$1 选择第二个字段比第一个字段长的行。

模式匹配表达式:用运算符~(匹配)和~!(不匹配)。

BEGIN:是让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。

END: 让用户在最后一条输入记录被读取之后发生的动作。

clip_image023

clip_image025

提取出文件中以,mail开头的行

clip_image027

提取出以mail或以bin开头的行

clip_image029

提取出以:为列分割符,第三列大于500的行

clip_image031

提取出第一列中 包含Root 或root 的行

clip_image033

提取出第一列中不包含root的行

clip_image035

把文件中第一列替换成root的

clip_image037

提取第一列等于root的行

clip_image039

/root/./mail/ 提取从root到mail之间的行

clip_image041

在awk中,ARGC 可以显示参数个数,ARGV 数组变量用来存储参数,从0开始

clip_image043

使用getline获取前面结果,

clip_image045

printf 定义格式化的输出,%3f 前面空三个字符,%3.1f 显示小数点后的一位,%3.2f 显示小数点以后的两位 可以四舍五入,%e 显示为科学计数法,%c显示为ASCII码

clip_image047