awk是比sed更强大的文本处理工具,sed通常是以一整行为处理单位,而awk则可以按照指定的分隔符将一整行分为多个字段单独进行处理。
awk的语法
awk -F separator ‘BEGIN{command}condition1{command1}condition2{command2}...END{command}‘ filename #除了处理filename之外 awk也以处理标准输入
-F 指定分隔符,默认是空格符 例如如果指定:为分隔符,则可以这样-F:
BEGIN用于指定在处理第一行之前应该执行的指令,如果command由多条,则可以用分号分开
END 用于指定处理完所有文本行之后应该执行的指令
中间的condition{command} 用来指定在处理文本行的时候应该执行的指令,condition用来指定条件通常是表达式,command用来指定满足condition的时候应该执行的操作。
awk的几个常用的内建变量
$0 当前处理的一整行内容
$1 当前处理的行使用separator分隔后的第一个字段
$2 。。。。。的第二个字段
$#。。。。。以此类推
NR 当前正在处理的行号
NF 当前处理的行有多少个字段
FS 当前指定的空格符,默认是空格键 其实完全可以用-F选项来替代
awk使用print 或者printf来向屏幕打印符合条件的内容,两者还是有一定区别的
使用print打印的话,字段之前使用,分隔,而打印的时候字段内容之间是用以空格分开
一个例子
awk -F: ‘{print $1,$3}‘ /etc/passwd
如果非要指定格式的话可以使用"" 里面加入转移字符 比如说"\t"
awk -F: ‘{print $1"\t"$2}‘ /etc/passwd
相比之下printf就更常用一些,printf可以方便以指定的格式打印内容
printf的基本格式 printf "pattern" content
在awk中使用printf的时候需要注意一下几点
1.pattern与content之间使用,分开
2.使用printf打印变量内容的时候,不要使用$var_name(除了$0,$1等内建变量)
3.被打印的变量之间也要使用,分开
4.需要在pattern中手动指定换行符\n
awk -F: ‘{printf "%10s\t%10s\n"},$1,$3‘ /etc/passwd
awk的功能远远不止与此,下面介绍一些常用的awk的其他功能
1.使用算数运算符
在awk的command中可以进行常见的算数运算
常见的算数运算符由+ - * / % += -= %= /= ++ --
2.使用比较操作符
> < >= <= == != ~
值得一提的是 ~ 用来判断某个字段是否符合正则表达式的模式,正则表达式的模式需要用//括起来
例子
awk -F: ‘$NF~/nologin$/{print $1,$NF}‘ /etc/passwd
3.使用控制语句
if else语句
awk -F: ‘{if($3<499){print $1,"System User"}else{print $1,"Common User"}}‘ /etc/passwd
需要注意的两点,与condition{command}不同,if条件语句是写在{}里面的,如果是执行语句由多条的话,必须使用{}括起来,如果执行语句只有一条的话,则可以省略{}
4.使用循环语句
while
awk -F: ‘{i=1;while(i<=3){printf "%-10s" ,$i;i++}}‘ /etc/passwd #对于每行只打印前三个字段
for
awk -F: ‘{for(i=1;i<=3;i++){print $i}}‘ /etc/passwd
使用for还可以用来遍历数组
语法结构为 for(var in array){command} #注意var是下标,不是数组的内容
awk -F: ‘{SHELL[$NF]++}END{for (S in SHELL){print S,SHELL[S]}}‘ /etc/passwd #统计每种shell用户的数量
5.continue,break,case,next不怎么常用,这里不在一一介绍
当然awk的功能远不止这些,这里仅仅是列处理最常用的一些功能,想了解更多自行man。
本文出自 “厚积薄发” 博客,请务必保留此出处http://joedlut.blog.51cto.com/6570198/1834647
原文地址:http://joedlut.blog.51cto.com/6570198/1834647