注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天朝布衣田中码农参上

苦逼码农的点点滴滴,请多多指教!

 
 
 

日志

 
 
 
 

linux下awk命令简易使用  

2017-06-20 15:42:46|  分类: 操作系统 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上可以说AWK的确拥有自己的编程语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,当然还有无数其他的功能。
A)使用方法,应该说是相当的简单:

awk '{pattern + action}' {filenames}

尽管操作可能会很复杂,但语法总是这样,其中pattern就是要表示的正则表达式,用斜杠括起来,而action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本【大体上有点类似于Window下的for /f】。
B)有三种方式可以调用awk:
1)命令行方式

awk [-F  field-separator]  'commands'  input-file(s)

其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
2)shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。相当于将shell脚本首行的#!/bin/sh换成:#!/bin/awk
3)将所有的awk命令插入一个单独文件,然后调用:

awk -f awk-script-file input-file(s)

其中,-f选项加载awk-script-file中的awk脚本。
C)入门基础实战:
1)取最近登录的5位用户:

last -n 5 | grep pts | awk '{print $1}'

linux下awk命令简易使用 - sinsunson - 天朝布衣田中码农参上
而如果不用 awk '{print $1}'执行的结果这样的。
linux下awk命令简易使用 - sinsunson - 天朝布衣田中码农参上
原理大体上就是,读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键"【如果要指定其它的分隔符请使用-F指定域分隔符】,所以$1表示登录用户,$3表示登录用户ip,以此类推。
2)如果需要在开始或结束时做额外的处理,就需要加入BEGIN和END操作,如读取/etc/passwd的账户和账户对应的shell。

cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "end,/bin/nosh"}'

linux下awk命令简易使用 - sinsunson - 天朝布衣田中码农参上
awk是这样的执行的:先执行BEGIN里的语句,然后读取文件······直到所有的记录都读完,最后再执行END操作。
3)接下来就可以尝试利用正则来处理文件了。

awk -F ':' '/^root/{print $7}' /etc/passwd

linux下awk命令简易使用 - sinsunson - 天朝布衣田中码农参上
这里是pattern的使用示例,匹配了pattern(这里是以root开关)的行才会执行action(没有指定action,那么就会默认输出每行的内容)。
D)内置变量。

RGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符

例如下:

awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

linux下awk命令简易使用 - sinsunson - 天朝布衣田中码农参上
还可使用printf替代print,可以让代码更加简洁,更易读。

awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,content:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd

E)变量和赋值
awk还可以自定义变量,例如下【统计/etc/passwd的账户人数】:

awk 'BEGIN {count=0;} {count++;} END{print "user count is ", count}' /etc/passwd

linux下awk命令简易使用 - sinsunson - 天朝布衣田中码农参上
F)条件语句
awk中的条件语句是从C语言中借鉴来的,使用也比较方便【统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般都是文件夹)】:

ls -l |awk 'BEGIN {size=0;} {if($5!=4096){size=size+$5;}} END{print "size is ", size/1024/1024,"M"}'

linux下awk命令简易使用 - sinsunson - 天朝布衣田中码农参上
 
G)循环语句,同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。
H)数组,awk中数组的下标可以是数字和字母,值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。
下面就用例子简要说明下【读取/etc/passwd的账户到数组,再循环显示】:

awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;} END{for(i=0;i<NR;i++) print name[i]}' /etc/passwd

linux下awk命令简易使用 - sinsunson - 天朝布衣田中码农参上

有关awk的用法极多,这里只罗列最简单也是常用的用法,更多请参考官网:http://www.gnu.org/software/gawk/manual/gawk.html



 

  评论这张
 
阅读(0)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017