awk脚本用法

一、awk脚本的格式

$ vim test.awk

BEGIN{
 	# 此处放置执行前的语句,定义变量,设置输出字符等
}
{
 	# 此处放置每行处理语句
}
END{
 	# 处理结束后执行的语句
}

执行脚本
$ awk -f test.awk /etc/passwd

awk 脚本执行顺序

awk ‘BEGIN{ commands } pattern{ commands } END{ commands }’ file

第一步: 执行BEGIN { commands } 语句块中的语句
BEGIN语句块:在awk开始从输入流中读取行之前执行,在BEGIN语句块中执行如变量初始化,打印输出表头等操作。

第二步:从文件或标准输入中读取一行,然后执行pattern{ commands }语句块。它逐行扫描文件,从第一行到最后一行重复这个过程,直到全部文件都被读取完毕。
pattern语句块:pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行。{ }类似一个循环体,会对文件中的每一行进行迭代,通常将变量初始化语句放在BEGIN语句块中,将打印结果等语句放在END语句块中。

第三步:当读至输入流末尾时,执行END { command }语句块
END语句块:在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。

awk 的条件

条件的类型条件说明
关系运算符>大于
关系运算符<小于
关系运算符>=大于等于
关系运算符<=小于等于
关系运算符==等于用于判断两个值是否相等,如果是给变量赋值,请使用“”号
关系运算符!=不等于
关系运算符A~B判断字符串A中是否包含能匹配B表达式的子字符串
关系运算符A!~B判断字符串A中是否不包含能匹配B表达式的子字符串
正则表达式/正则/如果在"//"中可以写入字符,也可以支持正则表达式

awk 中使用数组

数组是包含一系列元素的的表

BEGIN{ 
    # 此处放置执行前的语句,定义变量,设置输出字符等
    arry[0]=1
    arry["hello"]="world"
    print arry[0], arry["hello"]
}
{   # 此处放置每行处理语句
}
END{
    # 处理结束后执行的语句
}
$ awk -f test.awk passwd.txt
1 world

说明:数组的下表可以是数字也可以数字符串,处理文件是可以将处理的行文件域作为数字的下标
遍历数组方法

#遍历数组的第一种方法,数组下标为连续的数字
BEGIN{ 
    # 此处放置执行前的语句,定义变量,设置输出字符等
	arry[0]="DATA0"
	arry[1]="DATA1"
	arry[2]="DATA2"
	arry[3]="DATA3"
	arry[4]="DATA4"
	for(i=0;i<length(arry);i++)
	   print arry[i]
}
{   # 此处放置每行处理语句
}
END{
    # 处理结束后执行的语句
}

$  awk -f test.awk passwd.txt
DATA0
DATA1
DATA2
DATA3
DATA4
遍历数组的第二种方法
BEGIN{ 
    FS=":"
}                                                                                                       
{   # 此处放置每行处理语句
    arrStr[$1","$2]=$0
}
END{
    # 处理结束后执行的语句
    # 遍历数组的第二种方法
    for(arr in arrStr)
    {   
        print arr 
        print arrStr[arr]
        print "----------------------"
    }   
}

$ awk -f test.awk passwd.txt
bin,x
bin:x:2:2:bin:/bin:/usr/sbin/nologin
----------------------
root,x
root:x:0:0:root:/root:/bin/bash
----------------------
daemon,x
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
----------------------
sys,x
sys:x:3:3:sys:/dev:/usr/sbin/nologin
----------------------
sync,x
sync:x:4:65534:sync:/bin:/bin/sync
----------------------

说明:使用第一列和第二列中间用,连接作为下标, 将本行的整行数据存储到数组中,打印输出数组是分被输出了数组的下标值及对应行的数据

awk 传入参数

  1. 参数加在执行脚本之后

awk -f scriptfile var1=value1 var2=value2 inputfile

BEGIN{                                       
    FS=":"
}
{   # 此处放置每行处理语句
    print value
}
END{
    # 处理结束后执行的语句
}
$ echo |awk -f test.awk value="121"
121

说明:方式awk -f scriptfile var1=value1 var2=value2 inputfile ,参数只能在BEGIN之后获取文件第一行数据之后value才能生效
2) 通过-v参数进行传参

awk -v var1=value1 var2=value2 -f scriptfile inputfile

BEGIN{ 
    FS=":"
    print value
}
{   # 此处放置每行处理语句
    print value
}
END{
    # 处理结束后执行的语句
}
$ echo |awk -v value="参数" -f test.awk
参数
参数

说明:方式awk -v var1=value1 var2=value2 -f scriptfile inputfile 参数 在执行脚本内全部有效
3) ARGV[N],ARGV[0]为awk,下标从1开始是输入的参数。

$ echo | awk 'BEGIN{print ARGV[1]}' var1  var2
var1
$ echo | awk 'BEGIN{print ARGV[2]}' var1  var2
var2

awk 同时处理两个文件

awk -f test.awk passwd.txt test.txt

如何判断处理的是哪个文件呢?
答案:是用NR变量和FNR变量。NR变量随着读取的行数从1递增,FNR也递增,但是,遇到新文件时FNR又回到1。所以,如果NR==FNR,就说明是第一个文件,如果NR!=FNR,就说明是第二个文件
第一个文件内容:

$ cat passwd.txt 
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync

第二个文件内容:

$ cat test.txt
Tom    2012-12-11      car     53000
John   2013-01-13      bike    41000
vivi    2013-01-18      car     42800
Tom    2013-01-20      car     32500
John   2013-01-28      bike    63500

awk脚本内容:

$ cat test.awk
BEGIN{ 
   FS=":"
}
{   # 此处放置每行处理语句
	if(NR == FNR)
		print "1) "$0
 	else
		print "2) "$0
}
END{# 处理结束后执行的语句
}

执行脚本:

$ awk -f test.awk passwd.txt  test.txt
1) sys:x:3:3:sys:/dev:/usr/sbin/nologin
1) sync:x:4:65534:sync:/bin:/bin/sync
2) Tom    2012-12-11      car     53000
2) John   2013-01-13      bike    41000
2) vivi    2013-01-18      car     42800
2) Tom    2013-01-20      car     32500
2) John   2013-01-28      bike    63500
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

相约天涯海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值