文件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的

时候方便

美国多IP站群VPS商家选择考虑因素和可选商家推荐

如今我们很多朋友做网站都比较多的采用站群模式,但是用站群模式我们很多人都知道要拆分到不同IP段。比如我们会选择不同的服务商,不同的机房,至少和我们每个服务器的IP地址差异化。于是,我们很多朋友会选择美国多IP站群VPS商家的产品。美国站群VPS主机商和我们普通的云服务器、VPS还是有区别的,比如站群服务器的IP分布情况,配置技术难度,以及我们成本是比普通的高,商家选择要靠谱的。我们在选择美国多IP...

GreenCloudVPS($30/年),500G大硬盘VPS,10Gbps带宽

GreenCloudVPS最近在新加坡DC2节点上了新机器,Dual Xeon Silver 4216 CPU,DDR4内存,10Gbps网络端口,推出了几款大硬盘VPS套餐,基于KVM架构,500GB磁盘起年付30美元。除了大硬盘套餐外,还加推了几款采用NVMe硬盘的常规套餐,最低年付20美元。不过需要提醒的是,机房非直连中国,尤其是电信用户ping值感人,包括新加坡DC1也是如此。大硬盘VPS...

CloudCone月付$48,MC机房可小时付费

CloudCone商家在前面的文章中也有多次介绍,他们家的VPS主机还是蛮有特点的,和我们熟悉的DO、Linode、VuLTR商家很相似可以采用小时时间计费,如果我们不满意且不需要可以删除机器,这样就不扣费,如果希望用的时候再开通。唯独比较吐槽的就是他们家的产品太过于单一,一来是只有云服务器,而且是机房就唯一的MC机房。CloudCone 这次四周年促销活动期间,商家有新增独立服务器业务。同样的C...

awk命令为你推荐
96155北京公积金96155客户服务电话,怎么一步一步进到修改还款额度的地方?安装程序配置服务器失败SQL安装程序配置服务器失败iphone5解锁苹果5忘了锁屏密码怎么解锁密码缓冲区溢出教程适合黑客初级学者使用的黑客工具有那些 、渗透测试web渗透测试有前途吗镜像文件是什么什么是文件镜像?什么是镜像文件?9flash怎么使用ePSXe啊?qq空间装扮QQ空间装扮开机滚动条电脑开机有滚动条的画面ios7固件下载iphone自动下载IOS7固件版本怎么删除
vps侦探 域名解析服务器 namecheap 圣迭戈 12306抢票助手 193邮箱 新天域互联 七夕促销 jsp空间 已备案删除域名 双线主机 空间合租 国外视频网站有哪些 四川电信商城 双线asp空间 新加坡空间 全能空间 双线空间 卡巴斯基官网下载 97rb 更多