概念
由人名Aho,Weberger,Kernighan组合,一个行文本处理工具
语法
awk 'pattern + {action}'
(1) 单引号
'
'
是为了和shell命令区分开;
(2) 大括号
{}表示一个命令分组;
(3) pattern
是一个过滤器,表示命中pattern的行才进行action处理;
(4) action
是处理动作;
(5) 使用#作为
注释
案例: cat hello.txt | awk 'NR==3, NR==5 {print}' 显示hello.txt中第三行至第五行
关于pattern说明
(1) pattern可以是正则表达式,格式为/pattern/
(2) pattern和action可以只有其一,但是不能两者都没有
(3) 默认的action为print
案例: cat hello.txt | awk '/hello/' 显示匹配到hello的行
cat hello.txt | awk 'length($0) > 80 {print NR}' 显示长度大于80的行号
内置变量
FS 分隔符 默认空格
NR 当前行数,从1开始
NF 当前记录总共多少列
$0 当前记录
$1 ~ $n 当前记录的第n列
案例: cat hello.txt | awk 'NR==3,NR==5 {print $1, $NF}' 显示第三、四、五行的第一列和最后一列
内置函数
gsub(r, s) 在$0中用s替换r
index(s, t) 返回s中t的第一个位置
length(s) 返回s的长度
match(s, r) s是否匹配r
split(s, a, fs) 在fs上将s分成序列a
substr(s, p) 返回s从p开始的子串
操作符
[+ - * / % ++ -- += -=] 运算符
[== != > >= ~] 逻辑符
控制流程
BEGIN和END
案例: awk 'BEGIN {count=0} {count += length($0)} END {print count}' 计算文件字符个数
流程控制
if(condition) {} else {}
while(condition){}
do{} while(condition)
for(init;condition;step){}
break; continue
AWK和Shell交互
awk中使用shell定义的变量,用单引号括起来
awk中使用shell命令,用双引号括起来或者用system命令 echo hello | awk 'system("date > date.txt")'
从文件读取变量到awk中用getline,echo | awk '{while(getline < "date.txt") {print $0}}'
其他案例
last -n 5 | awk -F ':' '{print $1}' //显示最后5个登录者的信息,-F指定分隔符,默认Tab或空格
cat /etc/password |awk -F ':' 'BEGIN {print 'name,shell'} {print $1","$7} END {print '.......'}' //在开始和结尾追加内容