您的位置:首页 > 运维架构 > Linux

Linux常用指令 6

2016-08-28 22:20 316 查看

AWK

基本功能是在文件或字符串中基于指定规则游览和抽取信息,awk抽取信息后,才能进行其他文本操作。

调用awk

当前有三种方式调用awk,第一种方式为命令行方式

# commands是真正的awk命令,[-F域分隔符]是可选的,因为awk是使用空格作为缺省的域分隔符,因此如果要游览域间有空格的文本,不必指定这个选项,但如果要游览注入passwd文件,此文件各域以冒号作为分割符,则必须指明-F选项
awk [-F field-separator] 'commands' input-file(s)
#以冒号作为分隔符
awk -F:'commands' input-file


第二种方式是将所有awk命令插入一个文件,并使用awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它;第三种是将所有的awk命令插入一个单独文件,然后调用:

#-f选项指明在文件awk_script_file中的awk脚本,input_file(s)是使用awk进行游览的文件名
awk -f awk-script-file input-file(s)


awk脚本

awk脚本由各种操作和模式组成,如果设置了-F选项则awk每次读一条记录或一行,并使用指定的分隔符分割指定域,但如果未设置-F选项,awk假定空格为域分隔符,并保持这个设置直到发现一新行,当新行出现时,awk命令获悉已读完整条记录,然后在下一个记录启动读命令,这个读进程将持续到文件尾或文件不再存在。

模式和动作

任何awk语句都由模式和动作组成,在一个awk脚本中可能有许多语句,模式部分决定动作语句何时触发及触发事件,处理即对数据进行的操作,如果省略模式部分,动作将时刻保持执行状态。模式可以是任何条件语句或符合语句或正则表达式,模式包括两个特殊字段BEGIN和END,使用BEGIN语句设置计数和打印头,BEGIN语句使用在任何文本游览动作之前,之后文本游览动作依据输入文件开始执行,END语句用来在awk完成文本游览动作后打印输出文本总数和结尾状态标志,如果不特别指明模式,awk总是匹配或打印行数,实际动作在大括号内指明,动作大多数用来打印,但是还有些更长的代码诸如if和循环(looping)语句及循环退出结构,如果不指明采取动作,awk将打印出所有游览出来的记录。

域和记录

awk执行时,其游览域标记为$1,$2….$n,这种方法称为域标识,使用这些域标识将更容易对域进行进一步处理,使用\$1,\$3表示参照第1和第3域,这里用都要做域分隔,如果希望打印一个有5个域的记录的所有域,不必指明\$1,\$2,\$3,\$4,\$5,可使用\$0,意即所有域,awk游览时达到一新行,即假定到达包含域的记录末尾,然后执行新记录下一行的读动作,并重新设置域分隔,为打印一个域或所有域,使用print命令,这是一个awk动作(动作语法用圆括号括起来)



条件操作符(结合上述用例)



内置变量

awk有许多内置变量用来设置环境信息,这些变量可以被改变

变量名含义
ARGC命令行传入awk脚本的参数个数
ARGV是ARGC的参数排列数组,其中每一元素表示为ARGV
,n为期望访问的命令行参数
ENVIRON支持队列中系统环境变量的使用,要访问单独变量,使用实际变量名,如ENVIRON[“EDITOR”]=”Vi”
FILENAMEawk游览的文件名,支持awk脚本实际操作的输入文件,因为awk可以同时处理许多文件,因此如果访问了这个变量,将告值系统目前正在游览的实际文件
FNR游览文件的记录数,其变量值小于等于NR,如果脚本正在访问许多文件,每一新输入文件都将重新设置此变量
FS设置输入域分隔符,等价于命令行-F选项,缺省情况下为空格,如果用逗号来作分隔符,设置FS=”,”
NF游览记录的域个数,在记录被读之后再设置
NR已读的记录数
OFS输出域分隔符,缺省为空格,如果想设置为#,写入OFS=“#”
ORS输出记录分隔符,缺省为新行(\n)
RS控制记录分隔符,缺省为新行(\n)
举例:



#awk操作符

设置输入域到域变量名:一般的变量名设置方式为name=$n,这里name为调用的域变量名,n为实际域号

域值比较:在BEGIN中给变量名赋值;在关系操作中使用实际数值

修改数值域取值:在awk中修改任何域时,实际输入文件是不可修改的,修改的只是保存在缓存里的awk复本,awk会在变量NR或NF变量中反映出修改痕迹

修改文本域:给对象赋一个新的字符串

只显示修改记录:在模式后面使用花括号将只打印修改部分

创建新的输出域:要通过其他域赋予新域标识符

增加列值:使用符号+=

文件长度相加:要排除子目录,awk首先提出首字符为d的记录,然后将文件an长度列相加





内置的字符串函数

字符串含义
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
sprint(fmt,exp)返回经fmt格式化后的exp
sub(r,s)用$0中最左边最长的子串替代s
substr(s,p)返回字符串s中从p开始的后缀部分
substr(s,p,n)返回字符串s中从p开始长度为n的后缀部分
例:



printf修饰符



采用awk写的脚本,建议后缀名以.awk形式给出

例1:



例2:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux awk