awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息。通常,awk命令是以接收文件的一行为操作单位,每接收一行,然后执行相应的命令来处理文本。
使用方法:
awk 'pattern + action' {filename}
调用方式:
①命令行方式
awk [-F field-separator] 'commands' input-file(s)
②脚本方式
awk -f awk-script-file input-file(s)
内置变量:
ARGC #命令行参数
ARGV #命令行参数排列
ENVIRON #支持队列中系统环境变量使用
FILENAME #awk浏览的文件名
FNR #浏览文件的记录数
FS #设置输入域分隔符,等价于命令行-F
NF #浏览记录的域个数
NR #已读的记录数
OFS #输出域分隔符
ORS #输出记录分隔符
RS #控制记录分隔符
awk操作符
= += *= /= %= ^= #复制操作符
? #条件表达操作符
|| && ! #或、与、非
~ !~ #关系操作符,如$4~/brown/为$4域包含brown
< <= == != >> #关系操作符
++ -- #自加、自减
内置字符串函数:
gsub(r,s) #在整个$0中用s替代r
gsub(r,s,t) #在整个t中用s替代r
index(s,t) #返回s中字符串t的第一位置
length(s) #返回s长度
match(s,r) #测试s是否包含匹配r的字符串
split(s,a,fs) #在fs上将s分成序列a
sprint(fmt,exp) #返回经fmt格式化
sub(r,s) #用$0中最左边的最长的字串代替s
substr(s,p) #返回字符串s中从p开始的后缀部分
substr(s,p,n) #返回字符串s中从p开始长度为n的后缀
实例:
#输出passwd内容,以:分割
/etc> awk -F : '{print $1,$2,$3,$4,$5,$6,$7}' passwd
#同时打印行号
/etc> awk -F : '{print NR,$1,$2,$3,$4,$5,$6,$7}' passwd
#打印37~39行内容
/etc> awk -F : 'NR>=37 && NR<= 39 {print NR,$1,$2,$3,$4,$5,$6,$7}' passwd
#打印$1包含abc的
awk -F : 'NR>=37 && NR<= 40 {if($1~/abc/) print NR,$1,$2,$3,$4,$5,$6,$7}' passwd
#精确匹配$1为abc的
awk -F : 'NR>=37 && NR<= 40 {if($1=="abc") print NR,$1,$2,$3,$4,$5,$6,$7}' passwd
#查找磁盘使用率>85%号的
df -h|awk 'NR>=1 gsub("%","",$0) {if($5>=85)print $6,$5"%"}'
#打印指定行的日志
awk "NR>=1130178 && NR<=1130205" abc.log > ~/shellDemo/aaa.log