关闭

Linux常用指令 6

标签: linuxawk
82人阅读 评论(0) 收藏 举报
分类:

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],n为期望访问的命令行参数
ENVIRON 支持队列中系统环境变量的使用,要访问单独变量,使用实际变量名,如ENVIRON[“EDITOR”]=”Vi”
FILENAME awk游览的文件名,支持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:
这里写图片描述
这里写图片描述

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:13880次
    • 积分:513
    • 等级:
    • 排名:千里之外
    • 原创:39篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论