文本处理三剑客——grep,awk,sed;grep是基于pattern过滤输出,有三种模式,grep,egrep以及fgrep;sed则是一种流编辑器,进行插入删除,常用于进行文本中的替换操作;而awk的功能就更加强大了,作为一种格式化文本工具,awk通过分隔符控制文本,awk默认的分隔符是空格;awk还可以通过pattern匹配按行进行遍历,通过算术表达式对行进行排查,还可以for,while,continue,break等控制语句找到符合条件的信息进行输出;他还可以对输出的结果进行修饰采用printf的输出方式,控制格式;
awk其实就是gawk,他是通过从gawk链接过来的一个命令,使用man awk时出现的也是gawk的内容;这是因为以前的人一直使用awk成为了习惯,所以特地配置了这个命令的链接;
awk基本格式
awk [options] ‘program‘ file ...
program:pattern{action statements;...}
pattern:pattern在awk中有很多种类,其中典型的是在执行awk命令时首先需要执行的 pattern还可以执行正常环境下的pattern语法,不过需要用“//”包含;
action:print,printf两种,print作为正常的输出,输出匹配的字段,awk命令是一种基 于分隔符的形式来操作的命令,会将当前字段分隔为$1,$2,$3...$NF;由print来输出;printf 则可以在输出字段的同时,对字段进行格式规整的操作;
awk执行流程:
①首先执行BEGIN{}语句段,一段用于在数据前方起到一个开头的作用;
②读取指定文件中的每一行数据,按行遍历,根据我们提供的pattern值进行匹配,若想输出匹配 到的pattern数据,则print本身,不需要加字段$1,$2这些,如awk ‘$3>500{print}‘ /filepath;这 样就只输出$3这个字段中大于500的行数据了;
③执行END{}语句段;
awk:
常用选项:
-F:指定字段分割符;
-v:手动设置变量;var=value;
1.awk中的变量:
awk中的变量有两种,一种是自建变量,即用-v选项指定变量名,或者在语句块中直接声明使用;
另一种则是awk这个命令中的内建变量了;
内建变量:
FS:相当于-F选项的设置输入分隔符;
如:使用FS指定“:”作为字段分隔符;
OFS:设置输出分隔符,在输出的数据进行分隔,默认是空白字符;
如:
NF:字段数量,$NF作为输出的最后一个字段,而NF则输出这个字段的序列号;
如:$NF
NF
NR:awk遍历行时输出每行的行号;在END{}语句块使用时则输出awk遍历的这个文件的总行数;可 以将两个文件合起来一起统计行数,只要在文件路径处再加一个路径即可;这样统计出来的就是总 的行数;
如:
FNR:file number of record,分别统计各个文件的行数,行号;这样统计出来的就是两个文件 分别的行数
FILENAME:输出当前处理的文件名;
如:
ARGC:输出命令行中参数的个数;
如:
该段命令中的参数是awk,以及后面的文件路径
ARGV:以数组的形式保存命令行中参数的内容;
如:
2.printf:格式化输出结果
printf这个action,除了具备print的功能之外,他还可以为每个输出的量固定格式,固定其字符串长度,左右对齐,显示整数或浮点数等;
printf "format",item,item
format必须符合要求,且每一个item都需要对应一个模式,即一种format,format需要用双引号括起来;
format的格式与类型:
以%开头,后跟这个item类型
格式符:
%c:显示字符的ASCII码;
%d,%i:显示十进制整数;
%f:显示浮点数字;
%e,%E:使用科学计数法显示数字;
%g,%G:使用科学计数法显示浮点数字;
%s:显示字符串;
%u:显示无符号整数;
%%:显示%自己;
常用的是%s,%d等;当需要指定字符串长度时,直接在%后加字符串长度,如%10s,表示10个字节字符串;
-:表示向左对齐,默认是向右对齐;
+:显示数字的正负符号;
如%-10s,%+10s
示例:
3.操作符
①算术操作符
如 +,-,*,^,/,%
-x:将正数转化为负数;
+x:将字符串转化为数值;
如:x%y
②赋值操作符:
=,+=,-=,*=,/=,%=,^=
++,--
用法同上
③比较操作符:
>,>=,<,<=,==,!=
如:找到UID大于500的用户信息
④模式匹配操作符:
~:左边的字符串是否与右边的pattern匹配;
!~:左边的字符串是否与右边的pattern不匹配;
如:从$NF找到匹配nologin的行
⑤逻辑操作符:
与(&&),或(||),非(!)
可以将匹配信息相与或操作,提炼出想要的结果;
如:找到UID大于500小于1000的用户信息
⑥条件表达式:
condition(selector)?if-true-expression:if-false-expression
如:当满足UID大于500小于1000时,将变量user值设为yes,否则设为no
4.pattern
①空pattern:所有的行统一遍历,不存在匹配值;
②设置pattern,需要用“//”隔开;
如:
③设置pattern范围:/pattern1/,/pattern2/
如:找到开头为w,到开头以n的用户信息
④BEGIN{}
BEGIN{}语句块只有在awk命令执行之前才会实现;通常用于输出结果的开头;
如:设置开头的user UID标题
⑤END{}
END{}语句块只有在awk命令执行结束后才会实现,通常作为这一次命令的总结;
如:END语句块在尾部生成隔开符号*,并且计算总行数;
5.控制语句
如for,while,next,do-while,if-else等;
for循环:
语法:for (expr1;expr2;expr3) statement
expr1:给变量设置初值,如i=1;
expr2:给变量she‘zhi范围,如i<100;
expr3:执行递增递减操作,如i++,i--;
如:使用for循环遍历一行,读取一行中每一组分隔字段的长度,使用length内置函数;
while循环:为真则进入循环,为假则退出循环;
语法:while (condition) statement
如:
do-while循环:原理同while一样,不同在于,其是执行一遍再判断是否满足要求,若不满足再退出;
语法:do statement while (condition)
如:
next:当满足条件时则提前退出本次循环,进入下一次循环;
如:
break:当满足条件时则退出循环;
如:
continue:当满足条件时,则直接跳过本次循环,进行下一次循环;
同上;
6.数组:
awk中的数组有两个特性
①当数组本身不存在,却引用这个数组时,会将数组的值设为空字符串,相当于0;
②数组可以用字符串来表示,但字符串需要加双引号,如a["letter"];
引用数组
如:
查看一个设定好的文件中的单词的个数,使用for循环的s in array的形式:
如: