前言
awk是一个模式扫描及处理语言.既然是一门语言,那么它就拥有类似于其他编程语言。所以同学们,要学好awk,必须要有shell或其他语言的编程基础,如果你没有编程基础,那么先去建立吧.
基础语法
1.awk | -F field-separator| `cmd` input file
awk -F : `cmd` input file
2.将awk命令插入一个文件,并使awk程序可以执行,然后用awk命令解释器作为脚本首行。
3.将所有awk命令插入一个单独文件
awk -f awk-script-file inputfile
模式和动作
模式:两个特殊断 BEGIN和END
动作:实际动作大多在{}内指明
域和记录
浏览域表记为 $1,$2,......$n($1-$n称为域标识)
例子1:
需求:对一个文本里的数据进行去重
awk 'BEGIN{count=0} {if(!a[$0]++)count++} END{print "总共有:"count}' input file
输出
1.抽取域
awk -F: '{print $1}' /etc/passwd
2.保存输出
awk -F: '{print $1}' /etc/passwd | tee user
awk -F: '{print $1}' /etc/passwd >user
3.使用标准输出
4.打印所有记录
awk -F: '{print $0}' /etc/passwd
5.打印单独记录
awk -F: '{print $1,$4}' /etc/passwd
6.打印报告头
awk -F: 'BEGIN {print "NAME
"} {print $1}' /etc/passwd
7.打印结尾
awk -F: '{print $1} END {print "this is all users"}' /etc/passwd
8.打印某一行
awk '{if(NR==1)print $0}' /etc/passwd
条件操作符
1.匹配
awk '{if($1~/root/) print $0}' /etc/passwd //{if($1~/root/) print}表示如果field1包含root,打印它//
2.精确匹配
使用等号 ==
3.不匹配
!~
4.小于
if($6 < $7)
5.小于等于
6.大于
7.设置大小写
awk '/[Rr]oot/' /etc/passwd
8.任意字符
awk '$~/^...a/' /etc/passwd //^...a表示第四个字幕是a//
9.或关系匹配
'$0 ~/(root|ftp)/'
10.行首
awk '/^48/' input-file // ^48(行首包含48)
11.AND &&
'{if ($1=="P.bunny" && $4=="") print $0}'
12.OR ||
内置变量
ARCC 命令行参数个数ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FNR 浏览文件的记录数
FS 置顶分隔符,等价于-F
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
设置输入域到变量名
awk -F '{name=$1; pach=$7; if(name~/root/) print name" pach is "pach}' /etc/passwd
域值比较操作
awk '{if($6<$7) print $0}' input-file
修改改数值域取值
awk ‘{if($1="NAME) $6=$6-1; print$1,$6,$7}' input-file
修改文本域
awk ’{if($1="J.Troll") ($1="J.L.Troll); print $1}' input-file
只显示修改改记录
awk ’{if($1="J.Troll") {$1="J.L.Troll; print $1}}' input-file
创建新的输入域
awk '{if($6>$7) {$8=$6-$7; print $1,$8}' input-file
增加列值
awk '(tot=$6) END {print"..................."tot}' input-file
文件长度相加
ls -l | awk '/^[^d]/ {print $9" $5} {tot+ =$5} END {print "tltal kb:"tot}'
内置的字符窜函数
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
sub(s, ) 用$0中最左边也是最长的字符串替代
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分
1.gsub
awk 'gsub(/4842/,4899) {print $0}' input-file #/4842/为目标模式 4899为替换模式
awk 'gsub(/0/,2) {print $0}' /etc/fstab
awk '{print gsub(/0/,2) $0}' /etc/fstab
2.index查询字符串s中t出现的第一位置
awk 'BEGIN {print index("root","o")}'
awk -F: '$1=="root" {print index($1,"o")" "$1}' /etc/passwd
awk -F: '{print index($1,"o") $1}' /etc/passwd
3.length
awk -F: '{print length($1)} /etc/passwd'
awk 'BEGIN {$1="root" print length($1)'
4.match (在ANCD中查找C的位置)
awk 'BEGIN {print match("ANCD" ,/C/)}'
5.split
返回字符串数组元素个数
awk 'BEGIN {print split("123#456#789", myarray, "#")}'
6.sub 只能替换指定域的第一个0
awk '{print sub(/0/,"2",$1)' /etc/fstab
awk '{print sub(/0/,"2",$6)' /etc/fstab
7.substr 按照起始位置及长度返回字符串的一部分
awk 'BEGIN {print substr("Pavel.Nedved",7,3)}'
awk 'BEGIN {print substr("Pavel.Nedved",7)}'
awk -F: '{print substr($1,3)" " $1)}' /etc/passwd
字符串屏蔽序列
退格键
f 走纸换页
新行
回车
tab
c 任意其他特殊字符
ddd 八进制
很简单的例子
awk -F: '{print $1,""$2," "$3} /etc/passwd
总结:
此篇参考刘天斯博客的awk http://blog.liuts.com/post/53/,还有些循环控制的语法请再参考linux的man手册 man awk .