awk 实例演示

一.参数解释:

(1)-F fs or --field-separator fs :指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
(2)-v var=value or --asign var=value :赋值一个用户定义变量。
(3)-f scripfile or --file scriptfile :从脚本文件中读取awk命令。
(4)-mf nnn and -mr nnn :对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
(5)-W compact or --compat, -W traditional or --traditional :在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
(6)-W copyleft or --copyleft, -W copyright or --copyright :打印简短的版权信息。
(7)-W help or --help, -W usage or --usage :打印全部awk选项和每个选项的简短说明。
(8)-W lint or --lint :打印不能向传统unix平台移植的结构的警告。
(9)-W lint-old or --lint-old :打印关于不能向传统unix平台移植的结构的警告。
(10)-W posix :打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。
(11)-W re-interval or --re-inerval :允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
(12)-W source program-text or --source program-text :使用program-text作为源代码,可与-f命令混用。
(13)-W version or --version :打印bug报告信息的版本。

二.内建变量

$0当前记录(这个变量中存放着整个行的内容) 整行内容
$1~$n当前记录的第n个字段,字段间由FS分隔
FS输入字段分隔符 默认是空格或Tab
NF当前记录中的字段个数,就是有多少列
NR已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
FNR当前记录数,与NR不同的是,这个值会是各个文件自己的行号RS输入的记录分隔符, 默认为换行符
OFS输出字段分隔符, 默认也是空格
ORS输出的记录分隔符,默认为换行符
FILENAME当前输入文件的名字
SUBSEP:数组下标分隔符

三.条件判断

1.单条件判断:

161121_zbaT_2899810.png161136_zAbw_2899810.png

要留意的一个地方:

if 条件后面的语句块,如果是单个语句,可以省略花括号,如果是多个语句,必须用花括号

2.多条件判断:

105918_f4be_2899810.png

再如:

awk -F':' '{if($1=="apple"){$var=$2+50;print $var}else if ($1=="orange"){$var=$3+20;print $var}else if ($1=="pear"){$var=$3+30;print $var}}' face.txt

执行结果如下:

111649_l2T7_2899810.png

四.循环结构

1.for循环

for循环的圆括号中需要3个表达式,前两个分别是初始化表达式和测试表达式,第3个则用于更新测试表达式所用的变量。在awk的for循环中,圆括号里的第一条语句只能初始化一个变量(C语言中与之对应的语句则可以用逗号分隔的形式初始化多个变量)。

163041_MTxy_2899810.png

2.while循环

使用while循环的第一步是给一个变量设初值,然后在while表达式中测试该变量。如果求得表达式的值为真(非0),则进入循环体执行其中的语句。如果循环体内有多条语句,就必须用花括号把这些语句括起来。循环块结束之前,一定要更新用来控制循环表达式的变量,否则循环将无休止地进行下去。do/while循环与while 循环很相似,唯一的区别在于do/while要先执行循环体至少一次,然后才测试表达式。

163210_9FBS_2899810.png

五.BEGIN 与END语句

BEGIN 用于匹配输入文件的第一行之前的位置, END 则用于输出匹配文件处理过后的最后一行的形式。通常使用 BEGIN 来输出一个标题: 来显示变量和预置(初始化)变量,使用END来输出最终结果。

111839_rcVM_2899810.png

要注意的是: 此处例子的FS 分隔符要用双引号括起来。用作数字的awk变量的默认初始值为0,所以变量值为0的话就可以省略不写  。

再如:

164425_Dlzg_2899810.png

六.拆分文件--根据某列的不同值进行分类归档

1.根据指定列的值输出全部内容的值

命令语句:

netstat -nptoa |awk 'NR!=1{print >$6}'  

170113_Mqqt_2899810.png

说明:

NR!=1表示不处理表头(首行),示例演示的功能是根据第六列的不同值取文件名,再将所有列的值输出到先前不同文件名的文件里。

2.根据指定列的值定制输出想输出的列的内容

命令语句:

netstat -anopt|awk 'NR!=1{print $4,$5 >$6}'

165741_LfPH_2899810.png

解说:

该条命令实现的功能就是根据第6列的不同状态值取文件名,文件内容只包含第4,5列的值

七.统计,计数

1.统计文件夹下某种文件类型的文件大小

170653_ABwa_2899810.png

2.统计每个用户使用的内存大小

命令语句:

ps aux|awk 'NR!=1{a[$1]+=$6}END{for (i in a) print i ":" a[i]"KB"}'

170751_NKl1_2899810.png

3.统计文件相同行的次数

命令语句:

A:  awk -F'.' '{print $1}' 44.txt |awk -F '//' '{print $2}'|sort -nr|awk '{a[$1]++}END{for (i in a )print i,a[i]}' 

B: awk -F'.' '{print $1}' 44.txt |awk -F '//' '{print $2}'|sort -nr|awk '{a[$1]++}END{for (i in a ){print i, a[i]}}'

C:  awk -F'.' '{print $1}' 44.txt |awk -F '//' '{print $2}'|sort -nr|awk '{a[$1]++}END{for (i in a )print i a[i]}'  

备注: 留意下这三条命令在输出上的不同之处

170959_QVCk_2899810.png

4.删除文件中的重复行

171243_G0Sr_2899810.png

5.在awk里嵌入系统命令

命令语句:

awk '!/^$/{a[$7]++}END{for (i in a)printf "URL:%-20s count:%d\n",i ,a[i]|"sort -nr -t':' -k4 " }' 2017-02-16-0000-2330_gxxxx.cn.log |head -n5

173128_nWo4_2899810.png

如同所示: 在awk里嵌入系统命令,需用双引号把系统命令引起来,单引号也不行。演示的功能是统计日志文件里各域名的次数,并按逆序输出

6.split函数

命令语句:

awk 'BEGIN{split("3/10/2017",date,"/");print "The month is "date[1] " and the year is "date[3]}'

173531_1YmU_2899810.png

数组与split函数: awk的内置函数split能够将字符串拆分为词,然后保存在数组中。如未指定字段分隔符,也可以就用FS的当前值。
格式

split(字符串,数组,字段分隔符)

split(字符串,数组)

说明:将字符串3/10/2017保存到数组date中,用正斜杠作为字段分隔符。现在date[1]中是3,date[2]中是10,而date[3] 中则是2017。字段分隔符用第3个参数指定,如未指定,就以FS的值做字段分隔符。

八.字符匹配

模糊匹配: ~  精确匹配:  ==   不匹配:  !~   不精确匹配:  !==

174129_YSMG_2899810.png

174137_iOrv_2899810.png

转载于:https://my.oschina.net/szwyh2014/blog/856741

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值