当前位置: 首页 > Linux

linuxawk命令

时间:2023-04-06 19:49:56 Linux

前言:最近复习了awk,记录一下方便下次参考echo'1122'|awk'{print$1}'echo|awk'{print"helloworld!"}'1.awk变量内置常用变量$0当前记录,当前行所有列$1~$n当前第n个字段记录,字段之间用FS分隔FS输入字段分隔符,相当于命令行-F,默认为空格NF当前记录的字段数,即有多少列,总列数,$NF表示最后一列NR已经读取的记录数,也就是第一行,从1开始FNR当前记录数RS控制记录分隔符,默认为换行OFS输出字段分隔符也是空格ARGCdefault命令行参数个数ARGV命令行参数排列FILENAMEawk浏览文件名自定义变量类型echo|awk'i="helloworld"{printi}'echo|awk'i=1122{printi}'arrayecho|awk'{a[1]="hello";a[2]="world!";printa[1],a[2]}'2.awk常用的逻辑运算?条件表达式运算符||&&!And,AND,NOT~!~匹配运算符,包括匹配不匹配\+-*/%^算术运算符++--前缀和后缀=+=*=/=%=^=赋值运算符<<===!=>=>关系运算符BEGIN在输出界面第一行输出相关性END在输出界面最后一行输出相关性3.awk条件判断1.直接在最外层echo'1122'|awk'$1==11{print$2}'2.使用if语句```echo'1122'|awk'{if($1==11)print$2}'```3.Andornotandecho'1122'|awk'{if(($1==11)&&($2==22))打印$2}'或echo'1122'|awk'{if(($1==10)||($2==22))print$2}'nonecho'1122'|awk'{if($1!=10)print$2}'4.匹配~模糊匹配==精确匹配!~不匹配echo'ansiblenewswitf'|awk'{if($1~i)print$1}'echo'ansiblenewswitf'|awk'{if($1!~0)print$1}'5.正则匹配last|awk'/root/{print$0}'last|awk'/roo*/{print$0}'last|awk'/^root/{print$0}'四.awkloopfor(i=1;i<=10;i++)类似于C等语言使用awk插入一个符号“|”andtabtobuildlast|awk'{for(i=1;i<=NF;i++){printf$i"|\t"}print""}'NF每行的字段总数for(iinarray)类似于shellecho|awk'BEGIN{a[1]=1;a[2]=2}END{for(iina)printi,a[i]}'五。常用的内置函数gsub(r,s)将整个$0中的r替换为s,相当于sed's///g'gsub(r,s,t)将rindex(s,t)替换为s在整个t中,返回字符串t在s中的第一个位置length(s)returnslengthmatch(s,r)tests是否包含匹配r的字符串split(s,a,fs)将s分成一个序列aonfssprint(fmt,exp)返回由fmt格式化的expsub(r,s),用最左边最长的$0子串替换s,相当于sed's///'substr(s,p)返回字符串s中p开始的后缀部分substr(s,p,n)返回字符串s中p开始的n的长度后缀部分6.运维常用awk1.打印指定的倒数个数fields使用NF打印倒计时字段,例如打印倒数第二行lastawk'{print$(NF-1)}'2.打印文件的第1000行到2000行awk'1000<=FNR&&FNR<=2000'fileawk'{if(1000<=FNR&&FNR<=2000)打印$0}'file3.netstatnetstat-an|awk'/^tcp/BEGIN{s[$NF]++}END{for(ains)printa,s[a]用于循环、数组和自加的tcp状态统计}'4。替换例如:test.txthangsan70998877goodlisi90776688goodsansan80887889goodawk'{if($2>=90)gsub($NF,"VeryGood")}{print$0}'test.txthangsan70998877goodlisi90776688VeryGoodsansan80887889好