文件awk命令详解-转整理

awk命令  时间:2021-02-12  阅读:()

awk命令详解 转整理

一、前言awk有3个不同版本:awk、 nawk和gawk未作特别说明一般指ga wk。 awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息也可以基于指定的规则来输出数据。完整的awk脚本通常用来格式化文本文件中的信息。

二、基本语法awk[opion]'awk_s cript' input_file 1[input_file 2...]awk的常用选项op tion有

①-F fs :使用fs作为输入记录的字段分隔符如果省略该选项 awk使用环境变量I FS的值

②-f filen ame:从文件fi lenam e中读取a wk_sc ript

③-v var=value :为awk_scrip t设置变量awk有三种运行方式

第一种把awk的脚本命令直接放在命令中。

第二种把awk的所有的脚本命令放在一个脚本文件中然后用-f选项来指定要运行的脚本命令文件。

第三种将awk_scrip t放入脚本文件并以#!/bin/awk-f作为首行给予该脚本可执行权限然后在sh ell下通过键入该脚本的脚本名调用之。

三、 awk脚本awk脚本可以由一条或多条aw k_cmd组成对于多个a wk_cm d一个awk_cmd完成后应该另起一行 以便进行隔。awk_c md由两部分组成:awk_p atter n{actio ns} 。

另外在awk命令中直接使用awk_scrip t时awk_s cript也可以被分成多行书写但必须确保整个awk_scri pt被单引号括起来。awk命令的一般形式:awk'BEGIN {actio ns}awk_p atter n1 {actio ns}

. . .. .. .. .. ..awk_p atter nN{actio ns}

END{actio ns}

' input file

其中BEGIN {actio ns}和END{actio ns}是可选的。

在awk脚本中可以使用AWK本身内置变量如下

ARGC命令行变元个数

AR GV命令行变元数组

FILEN AME当前输入文件名

FNR当前文件中的记录号

FS输入域分隔符默认为一个空格

RS输入记录分隔符

NF当前记录里域个数

NR到目前为止记录数

OFS输出域分隔符

ORS输出记录分隔符awk脚本的运行过程:

①如果BEG IN区块存在 awk执行它指定的a ction s。

②awk从输入文件中读取一行称为一条输入记录。 (如果输入文件省略将从标准输入读取)

③awk将读入的记录分割成字段将第1个字段放入变量$1中第2个字段放入$2 以此类推。 $0表示整条记录。字段分隔符使用she ll环境变量IFS或由参数指定。

④把当前输入记录依次与每一个aw k_cmd中awk_patte rn比较看是否匹配如果相匹配就执行对应的acti ons。如果不匹配就跳过对应的acti ons直到比较完所有的aw k_cmd 。⑤当一条输入记录比较了所有的aw k_cmd后 awk读取输入的下一行继续重复步骤③和④这个过程一直持续直到awk读取到文件尾。

⑥当awk读完所有的输入行后如果存在E ND就执行相应的acti ons。

1)inp ut_file可以是多于一个文件的文件列表 aw k将按顺序处理列表中的每个文件。

2)一条awk_cmd的awk_p atter n可以省略省略时不对输入记录进行匹配比较就执行相应的acti ons。一条awk_cmd的actio ns也可以省略省略时默认的动作为打印当前输入记录,即{print $0} 。一条awk_cmd中的awk_patte rn和ac tions不能同时省略。

3)BEGIN区块和EN D区块别位于awk_scrip t的开头和结尾。 awk_s cript中只有EN D区块或者只有BEG IN区块是被允许的。如果awk_scri pt中只有BEGIN {actio ns}  awk不会读取inp ut_file。

4)awk把输入文件的数据读入内存然后操作内存中的输入数据副本aw k不会修改输入文件的内容。

5)awk的总是输出到标准输出如果想让a wk输出到文件可以使用重定向。

3.1.awk_p atter nawk_p atter n模式部分决定act ions动作部分何时触发及触发actio ns。awk_p atter n可以是以下几种类型:

1)正则表达式用作awk_patt ern:/regex p/

注意正则表达式regex p必须被/包起来awk中正则表达式匹配操作中经常用到的字符:

\^$. [] | () *// 通用的re gexp元字符

+:匹配其前的单个字符一次以上是awk自有的元字符不适用于grep或s ed等? :匹配其前的单个字符1次或0次是awk自有的元字符不适用于grep或s ed等关于正则表达式的更多内容请参《正则表达式》

举例:aw k'/*\$0\.[0-9][0-9].*/' inp ut_file

比如行内容为$0.99.helll o的行就可以和上面的正则表达式相配

2)布尔表达式用作awk_patt ern表达式成立时触发相应的actio ns执行。

①表达式中可以使用变量(如字段变量$1,$2等)和/regex p/

②布尔表达式中的操作符:

关系操作符:<><=>===!=

匹配操作符:value ~/regex p/如果val ue匹配/regex p/则返回真value !~/regex p/如果val ue不匹配/regex p/则返回真

举例:aw k'$2>10{p r int "ok"}' input_fileaw k'$3~/^d/ {pr int "ok"}' input_file

③&&(与)和| |(或)可以连接两个/regex p/或者布尔表达式构成混合表达式。 !(非)可以用于布尔表达式或者/regex p/之前。

举例:aw k'($1<10)&&($2>10) {print $0"ok"}' input_file

aw k'/^d/ | | /x$/ {print $0"ok"}' input_file

④其它表达式用作awk_scri pt如赋值表达式等

举例:awk'(tot+=$6);END{print "total point s:"tot }' input_file //分号不能省略awk'tot+=$6{print $0}END{print "total point s:" tot }' input_file //与上面等效

当使用赋值表达式时表示如果赋值后的变量是数字的话如果为非0就, 匹配否则不匹配如果为字符串的话非空就为匹配否则不匹配。awk内置字符串函数:gsub(r s) 在整个$0中用s替代rawk'gsub(/name/ "xingm ing") {print $0}' tempgsub(r s t) 在整个t中用s替代rindex (s t) 返回s中字符串t的第一位置awk'BEGIN {print index("Sunny" "ny")}' temp 返回4lengt h(s) 返回s的长度match(s r) 测试s是否包含匹配r的字符串awk'$1=="J.Lulu" {print match($1 "u")}' temp 返回4split (s a fs) 在fs上将s分成序列aawk'BEGIN {print split ("12#345#6789"myarr ay "#")"'

返回3 同时mya rray[1]="12" myarr ay[2]="345" myarr ay[3]="6789"sprin t(fmt exp) 返回经fm t格式化后的expsub(r s) 从$0中最左边最长的子串中用s代替r(只更换第一遇到的匹配字符串)subst r(s p) 返回字符串s中从p开始的后缀部分subst r(s p n) 返回字符串s中从p开始长度为n的后缀部分awk字符串连接操作

[cheng mo@cento s5~]$awk'BEGIN{a="a";b="b";c=(a""b);print c}'ab

2.7. print f函数的使用:

字符转换:echo"65" |awk'{print f"%c\n" $0}' 输出Aawk'BEGIN {print f"%f\n" 999}' 输出999.00000 0

格式化输出:awk'{print f"%-15s%s\n" $1  $3}' temp将第一个域全部左对齐显示

2.8. 其他awk用法:

向一行awk命令传值:awk'{if($5who| awk'{if($1==user)print $1 "are in"$2'user=$LOGNA ME使用环境变量awk脚本命令:

开头使用!/bin/awk-f 如果没有这句话自含脚本将不能执行例子:

!/bin/awk-f

#all comme nt lines must start with a hash'#'

#name: stude nt_to t.awk

#to call: stude nt_to t.awk grade.txt

#print stotal and avera ge ofclub stude ntpoint s

#print aheade rfirst

BEGIN

{print "Stude nt Date Membe rNo. Grade Age Point s Max"print "Name Joine dGaine d Point Avail able"print "========================================================="

}

#let's add the score sof point sgaine d

(tot+=$6);

#finis hedproce ssing now let's print the total and avera gepoint

END

{print "Club stude nttotal point s:" totprint "Avera ge Club Stude ntpoint s:"tot/N

}

2.9. awk数组:awk的循环基本结构

For (eleme nt in array)print array[eleme nt]awk'BEGIN {recor d="123#456#789";split (recor dmyarr ay "#")}

END{ for(i in myarr ay) {print myarr ay[i]} }

3.0 awk中自定义语句

一.条件判断语句(if)if(表达式)#if(Varia ble in Array )

语句1els e

语句2

格式中"语句1"可以是多个语句如果你为了方便Uni xawk判断也方便你自已阅读你最好将多个语句用{}括起来。Unix awk分枝结构允许嵌套其格式为if(表达式)

{语句1}else if(表达式)

{语句2}els e

{语句3}

[cheng mo@local host nginx]#awk'BEGIN{test=100;if(test>90)

{print "very good";

}else if(test>60)

{print "good";

}els e

{print "no pass";

}

}'very good

每条命令语句后面可以用“ ”号结尾。

二.循环语句(while ,for,do)

1.while语句

格式while (表达式)

{语句}

例子

[cheng mo@local host nginx]#awk'BEGIN{test=100;total=0;while (i<=test)

{total+=i;i++;

}print total ;

}'

5050

2.for循环for循环有两种格式

格式1

for(变量in数组)

{语句}

例子

[cheng mo@local host nginx]#awk'BEGIN{for(k in ENVIR ON)

{print k"="ENVIR ON[k];

}

}'

AWKPA TH=. :/usr/share/awk

OLDPW D=/home/web97

SSH_A SKPAS S=/usr/libex ec/opens sh/gnome-ssh-askpa ssSELIN UX_LE VEL_R EQUES TED=

SELIN UX_RO LE_RE QUEST ED=

L ANG=zh_CN.GB231 2

。 。 。 。 。 。

说明 ENVIR ON是awk常量是子典型数组。格式2for(变量;条件;表达式)

{语句}

例子

[cheng mo@local host nginx]#awk'BEGIN{total=0;for(i=0;i<=100;i++)

{total+=i;

}print total ;

}'

5050

3.do循环

格式do

{语句}while (条件)

例子

[cheng mo@local host nginx]#awk'BEGIN{total=0;i=0;do

{total+=i;i++;

}while (i<=100)print total ;

}'

5050

以上为awk流程控制语句从语法上面大家可以看到与c语言是一样的。有了这些语句其实很多s hell程序都可以交给awk而且性能是非常快的。break 当break语句用于while或for语句时导致退出程序循环。conti nue当conti nue语句用于while或for语句时使程序循环移动到下一个迭代。next能能够导致读入下一个输入行并返回到脚本的顶部。这可以避免对当前输入行执行其他的操作过程。exit语句使主输入循环退出并将控制转移到END,如果END存在的话。如果没有定义END规则或在END中应用ex it语句则终止脚本的执行。

NR与FN R

QUOTE:

A awk对多输入文件的执行顺序是先将代码作用于第一个文件一行行读入 然后该重复的代码又作用于第二个文件再作用于第三个文件。

B awk对多输入文件的执行顺序产生了行序号的问题。当第一个文件执行完下次读入第二个文件那么第二个文件的第一行怎么算呢如果又计为1的话那不就两个1了么因为第一个文件也有第一行 。这就是NR和FNR的问题。

NR全局行数第二个文件的第一行接着第一个文件尾行数顺序计数

FNR 当前文件自身的行数不考虑前几个输入文件的自身行数及总数

例如 data 1 .txt中有40行 data2.txt中有50行那么awk ‘{} ’ data 1 .txt data2.txt

NR 的值依次为 1 2„„40 41  42„„90

FNR的值依次为 1  2„„40 1  2„„50

getli ne函数说明awk的getli ne语句用于简单地读取一条记录。如果用户有一个数据记录类似两个物理记录那么get line将尤其有用。它完成一般字段的分离(设置字段变量$0 FNR NF NR)。如果成功则返回1失败则返回0到达文件尾 。

QUOTE:

A getli ne从整体上来说应这么理解它的用法

当其左右无重定向符|或<时 getli ne作用于当前文件读入当前文件的第一行给其后跟的变量var或$0 无变量 应该注意到由于awk在处理ge tline之前已经读入了一行所以get line得到

的返回结果是隔行的。

当其左右有重定向符|或<时 getli ne则作用于定向输入文件 由于该文件是刚打开并没有被awk读入一行只是get line读入那么get line返回的是该文件的第一行而不是隔行。

B getli ne用法大致可分为三大类每大类又分两小类  即总共有6种用法。代码如下QUOTE:nawk ‘BEGIN{“cat data.txt” |getli ne d;print d}’ data2.txtnawk ‘BEGIN{“cat data.txt” |getli ne;print $0} ’ data2.txtnawk ‘BEGIN{getli ne d< “data.txt” ;print d}’ data2.txtnawk ‘BEGIN{getli ne< “data.txt” ;print $0} ’ data2.txt

以上四行代码均实现“只打印da ta.txt文件的第一行” 若打印全部行用循环eg.nawk ‘BEGIN{FS=” :” ;while (getli ne<” /etc/pas sw d”>0){print $1}} ’ data.txtQUOTE:nawk ‘ {getli ne d;print d”#” $3} ’ data.txtawk首先读入第一行接着处理g etlin e函数然后把下一行指定给变量d再先打印d 由于d后面有换行符所以后面紧跟的会覆盖d后面的$3同样也会覆盖d。

QUOTE:nawk ‘ {getli ne;print $0” #” $3} ’ data.txtawk首先读入第一行接着处理g etlin e函数然后把下一行指定给$0现在的$0已经是下一行内容后面的#和$3 从$0中取会覆盖$0的内容。

在awk中有时需要调用系统工具来完成aw k不擅长的工作 awk提供的syst em命令可以用来执行但收不到外部工具的输出结果。好在可以运用getl ine来满足这个需求。例如test.awk:

{datec omman d="/bin/date-j -f\"%d/%b/%Y:%H:%M:%S\" "$oldda testr "

\"+%Y%m%d%H%M%S\"";datec omman d|getli nenewda testrclose (datec omman d);

}

外部命令需要awk占用一个文件描述符而awk最多能打开的文件有一个上限而且不大比如说16 所以最后做一个clo se是好习惯。把命令串定义为一个变量也是为了close的

时候方便

1C2G5M轻量服务器48元/年,2C4G8M三年仅198元,COM域名首年1元起

腾讯云双十一活动已于今天正式开启了,多重优惠享不停,首购服务器低至0.4折,比如1C2G5M轻量应用服务器仅48元/年起,2C4G8M也仅70元/年起;个人及企业用户还可以一键领取3500-7000元满减券,用于支付新购、续费、升级等各项账单;企业用户还可以以首年1年的价格注册.COM域名。活动页面:https://cloud.tencent.com/act/double11我们分享的信息仍然以秒...

华圣云 HuaSaint-阿里云国际站一级分销商,只需一个邮箱即可注册国际账号,可代充值

简介华圣云 HuaSaint是阿里云国际版一级分销商(诚招募二级代理),专业为全球企业客户与个人开发者提供阿里云国际版开户注册、认证、充值等服务,通过HuaSaint开通阿里云国际版只需要一个邮箱,不需要PayPal信用卡,不需要买海外电话卡,绝对的零门槛,零风险官方网站:www.huasaint.com企业名:huaSaint Tech Limited阿里云国际版都有什么优势?阿里云国际版的产品...

修罗云50元/月起香港大宽带NAT VPS,香港沙田建站2核2G5M仅70元/月起

修罗云怎么样?修罗云是一家国内老牌商家,修罗云商家以销售NAT机器起家,国内的中转机相当不错,给的带宽都非常高,此前推荐的也都是国内NAT VPS机器。今天,云服务器网(www.yuntue.com)小编主要介绍一下修罗云的香港云服务器,适合建站,香港沙田cn2云服务器,2核2G,5M带宽仅70元/月起,同时香港香港大带宽NAT VPS低至50元/月起,性价比不错,可以尝试一下!点击进入:修罗云官...

awk命令为你推荐
人人时光机寻时光机歌词pwlosera,pw是什么,是不认识的人发的短信。请解释::伪静态如何设置伪静态规则http与https的区别https://和http://区别手机区号有的手机号中间的号码是地区区号,那是什么卡qq怎么发邮件怎样在QQ上发送邮件?神雕侠侣礼包大全神雕侠侣陈晓礼包兑换码怎么获得ios7固件下载iphone自动下载IOS7固件版本怎么删除ios系统ios系统的手机有哪些?机械键盘轴机械键盘的轴哪种好?
虚拟主机测评 免费域名跳转 80vps BWH 香港主机 512m内存 anylink 申请个人网站 怎样建立邮箱 vul 免费稳定空间 闪讯网 葫芦机 免费的加速器 e-mail 服务器机柜 server2008 winserver2008下载 阿里云宕机故障 shuangshiyi 更多