在linux中awk绝对是核心工具,特别是在查找搜索这一领域,和掌握sed命令一样重要
下面为awk的一些基本知识,基于这些知识,可以让你随意操控一个文件:
在awk中:()括号为条件块,{}为执行的命令块
一般情况下awk有这几部分组成:
awk 'BEGIN{}(){}END{}' file
BEGIN为初始化操作,中间为对file文件中每一行的处理,END块中为最后的输出
当然,awk不是必须这3个都有,也不是缺少谁就不行的。可以只有BEGIN,也可以只有END
print命令
打印文件内容awk '{print}' datafile
-f参数
执行awk脚本,如脚本为hello.awkawk -f hello.awk datafile
$number
表示记录的字段,其中$0表示整个串
FS
表示字段分隔符,如下以逗号作为分隔符awk 'BEGIN{FS=","}{print}' datafile当写脚本文件时,一般用FS
-F参数
同FS作用一样,设置分隔符,如awk -F "," '{print $1}' datafile
NF
表示当前记录行中的字段数量
NR
表示当前记录的编号,即行号
FNR
当前浏览文件的记录数
FS="\t+"
表示以一个或多个制表符作为分隔符
OFS
字符分隔符,俩个字段间插入分隔符
RS
记录分隔符,即一行的分隔符
ORS
输出记录分隔符,俩个记录间(行)插入
OFMT 数的输出格式
CONVFMT 数值的内部转换格式
布尔表达式
awk -F "," '$1=="Hello" {print $1}' datafile只有第一个参数值为Hello时,才打印第二个
length(string1)
返回string1长度
index(string1,string2)
返回string2在string1中的位置,没有返回0
tolower(string1)/toupper(string1)
返回大小写
substr(string1,5,3)
从string1的第5位置开始截取长度为3的字段
match(string1,/you/),RSTART,RLENGTH
match匹配的是一个正则表达式RSTART返回第一个匹配的位置RLENGTH指定他占据的字符跨度,没有为-1
gsub/sub(/My/,"You",string1)
gsub全局替换,sub只替换第一个如上为在string1中查找My并替换为You
split(string1,strarray,",")
print strarray[1],strarray[numelements]把string1以逗号分割,并传入到strarray组中从1开始编号
删除重复行(必须先排序)
sort datafile|awk '{if($0!=line)print;line=$0}'
FILENAME
awk中特殊存在,用于表示文件awk 'END{print FILENAME}' datafile打印file名字若有多个输入文件则可以用于判断,如:awk 'if(FILENAME=="file1"){arr[$3]=$1}else{($1 in arr){print arr[$1]"|"$2}} file1 file2注意:awk先处理前面文件再处理后面文件
ARGIND
当前被处理参数标记
ARGC
命令行参数个数
ARGV
命令行参数排列
ENVIRON
支持队列中环境变量的使用
next
下一个命令不执行awk '(NR%2=1){next}{print}' f1awk 'NR==FNR{a[$0]=$0;next}a[$0]{print a[$0],$0}
nextfile
中断当前文件处理,进入下个文件处理:awk '{print FILENAME;nextfile} f1 f2打印俩个文件名,多用于查找文件
exit
停止awk,并执行END语句块后退出
定义函数:
awk '{print "sum=",sqrtsum($1,$2)}function sqrtsum(x,y){return x*x+y*y}' fileawk '{print "sum=",$1*$1+$2*$2}
-v
加载环境或shell中的参数awk-F \| -v ORAHOME=${ORA_HOME} '{print $1"|"ORAHOME>"datafile1"} datafile或者如下:awk-F \| '{print $1"|"ORAHOME>"datafile1"} ORAHOME=${ORA_HOME} datafile注:若在BEGIN中使用环境变量,则必须使用-v模式
getline
获取文件的行内容,一般放在BEGIN中一个getline获取一行,也可以保存到变量awk 'BEGIN{getline var1}END{print var1}' file
打印5行之后的行:
awk 'NR>5' file打印2到6行:awk 'NR==2,NR==6' file打印前5行:awk '!(NR>5)' fileawk 'NR<6' file打印5倍数的行:awk '(NR%5==0){print}' fileawk '!(NR%5){print}' file
awk中相关操作符使用
~操作符
俩边匹配符,可模糊比较,如:awk 'BEGIN{FS="|"}($2~/..My./){print}' file表示在第二个字段中包含5个字符,其中第3、4个字符为My的行
比较运算符
==俩边相等> >=<<=!=俩边不等~ 匹配正则表达式!~ 不匹配正则表达式‖逻辑或&& 逻辑与算术运算符
+ 加法- 减法* 乘法/ 除法^ 指数算法% 模算法-- 自-1(前后自减)++ 自+1(前后自加)+= 自加算法-= 自减算法*= 自乘算法/= 自除算法^= 自指数算法%= 自模算法统计文本中空行数量
awk 'BEGIN{x=0}/^$/{x+=1}END{print x}' datafile/^$/表示空行正则表达式:
\ 转义符^ 行首符$ 行尾符. 匹配一个字符[ ] 匹配其中一个字符| 或操作( ) 判断语句* 匹配0个或多个前面的字符+ 匹配前面一个或多个字符? 匹配模式出现频率if语句if($1=="foo"){ print "foo"}else if($1=="bar"){ print "bar"}else{ print "other"}
do..while语句
{ count=6do{ print count count-- }while(count!=1)}
while语句
{ while(x<NF){ print $x x++ }} for语句for(x=1;x<=5;x++){ print x}