运维

运维工程师的成长路

运维——三剑客之AWK(一)

awk介绍
awk:Aho, Weinberger, Kernighan,取三个人名字的前三个字母,报告生成器,格式化文本输出
                   有多种版本:New awk(nawk),GNU awk( gawk)(centos中自带的是gawk)
基本格式:awk [options] 'program' file…
program:pattern{action statements;..}
pattern和action:
pattern部分决定动作语句何时触发及触发事件
BEGIN,END
action statements对数据进行处理,放在{}内指明
print, printf(列和列之间对齐)
分割符、域和记录
awk执行时,由分隔符分隔的字段(域)标记$1,$2..$n称为域标识。$0为所有域,注意:和shell中变量$符含义不同
文件的每一行称为记录 $1 $2之间可指定分隔符必须加上双引号
省略action,则默认执行 print $0 的操作


awk工作原理
第一步:执行BEGIN{action;… }语句块中的语句
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,从第一行到最后一                        行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{action;…}语句块
             BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表                        格的表头等语句通常可以写在BEGIN语句块中
             END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在                           END语句块中完成,它也是一个可选语句块
             pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },                       即打印每一个读取到的行,
awk读取的每一行都会执行该语句块
print格式: print item1, item2, ...
要点:
(1) 逗号分隔符
(2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式
(3) 如省略item,相当于print $0
awk变量
变量:内置和自定义变量
FS:输入字段分隔符,默认为空白字符
awk -v FS=':' '{print $1,FS,$3}’ /etc/passwd
awk –F: '{print $1,$3,$7}’ /etc/passwd
OFS:输出字段分隔符,默认为空白字符
awk -v FS=‘:’ -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd
RS:输入记录分隔符,指定输入时的换行符
awk -v RS=' ' ‘{print }’ /etc/passwd
ORS:输出记录分隔符,输出时用指定符号代替换行符
awk -v RS=' ' -v ORS='###'‘{print }’ /etc/passwd
NF:字段数量
awk -F: ‘{print NF}’ /etc/fstab,引用内置变量不用$
awk -F: '{print $(NF-1)}' /etc/passwd
NR:记录号
awk '{print NR}' /etc/fstab ; awk END'{print NR}' /etc/fstab
FNR:各文件分别计数,记录号
awk '{print FNR}' /etc/fstab /etc/inittab
FILENAME:当前文件名
awk '{print FILENAME}’ /etc/fstab
ARGC:命令行参数的个数
awk '{print ARGC}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab
ARGV:数组,保存的是命令行所给定的各参数
awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab
自定义变量(区分字符大小写)
(1) -v var=value
(2) 在program中直接定义
首先要注意AWK中的行可不是我们平时说的,他可以指定,比如我们指定以冒号为分割符那么从开始到第一个冒号之间就是
第一行,第一个冒号与第二个冒号之间就是第二行,以此类推
$1 $2 分别表示第几个字段,但$0表示所有域与print默认的输出一样
awk -F: '{print}'  /etc/passwd和awk -F: '{print $0}' /etc/passwd 执行结果是一样的,如图:




看了上面那么多是不是头晕了,没事我们通过例子来说明:


还可以利用管道


总结:AWK可以用管道、重定向等作为其标准输入
如上,这样的输出并不太易读,我们还可以根据自己的爱好给两个字段之间添加一些符号比如:



变量在使用前必须要先定义,而且在前面加上-v 有几个变量就加几个,
如果在输出时不想换行输出想根据自己的定义输出分隔符那么我们可以这样定义:



我们还可以查看每行到底有几个字段:


对比下面这个


如果加$符号表示的是一个默认变量,代表这行的最后一个字段,如果不加表示这行总共有几个字段

根据上面的介绍我们还可以取倒数第几个字段如下:


那么这个文件到底有几行呢,我们可以这样查看:(为了节约空间截图省略下面的部分)


如果多个文件是什么情况呢?



竟让把两个文件当作一个文件去统计行号了,这并不是我们想要的结果,没事我们还有命令请看:



这样就可以显示每个文件的行数了,那么问题又来了,我们怎么知道是哪个文件啊,没关系且往下看:



这样是不是就一目了然了
我们还可以在没有处理文本之前做一些事情或者在处理之后做一些事情,也可以这样来做:



特别注意:BEGIN END都必须大写,并且在单引号内,后边必须有大括号括起来

接下来看看变量如何使用:在使用变量之前我们要先定义后使用,如果没有先定义就使用会是怎么样的情况呢,如下图:


所以变量必须要先定义后使用如下图:


调用文件

    如果经常要用到某个Pattern,那么我们可以先把pattern存放在一个文件中,用的时候只需去调用就     可以,例如:

编辑文件 vim awkscript

   {print $1,$7}  (对经常用的pattern进行编辑 )

  接下来我们就可以调用了



如果你感觉对您有帮助别忘了点赞评论让更多的爱好者学习,如果有错误,也要及时给我留言我会及时改正

阅读更多
个人分类: linux运维
想对作者说点什么? 我来说一句

Linux三剑客awk sed grep全攻略

2017年07月14日 2.37MB 下载

没有更多推荐了,返回首页

不良信息举报

运维——三剑客之AWK(一)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭