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
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
AWK 是一种文本处理工具,可以用于从文本文件中提取、过滤和处理数据。下面是使用 AWK 编写和执行脚本的一些基本步骤: 1. 编写 AWK 脚本AWK 脚本由模式和操作构成,其中模式用于匹配输入文本,操作用于处理匹配到的文本。例如,以下 AWK 脚本可以输出 `/etc/passwd` 文件中 UID 大于 1000 的用户的用户名和所在的 shell: ``` #!/usr/bin/awk -f BEGIN { FS=":" } $3 > 1000 { print $1, $NF } ``` 在上面的脚本中,`BEGIN` 语句块用于在执行 AWK 命令之前进行一些初始化操作,例如设置输入字段分隔符为 `:`。模式 `$3 > 1000` 匹配 UID 大于 1000 的行,操作 `print $1, $NF` 输出用户名和所在的 shell。 2. 保存 AWK 脚本为文件。将 AWK 脚本保存为一个文件,例如 `test.awk`。 3. 执行 AWK 命令。可以使用以下命令执行 AWK 脚本: ``` awk -f test.awk /etc/passwd ``` 在上面的命令中,`-f` 参数指定 AWK 脚本文件名,`/etc/passwd` 是要处理的输入文件名。执行该命令后,会输出 UID 大于 1000 的用户的用户名和所在的 shell。 除了使用文件作为输入,还可以使用输入重定向和管道来传递输入数据。例如,以下命令可以使用 `echo` 命令输出一行文本,并将其作为输入传递给 AWK 命令: ``` echo "hello world" | awk '{print toupper($0)}' ``` 在上面的命令中,`{print toupper($0)}` 操作将输入文本转换为大写并输出。 这些是使用 AWK 编写和执行脚本的基本步骤,AWK 还有更多的功能和用法,可以参考 AWK 的文档和教程来学习。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

相约天涯海角

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

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

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

打赏作者

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

抵扣说明:

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

余额充值