娃哈哈好喝-真的!
技术够用就行,吃好喝好睡好!

awk常用方法

参数

-f  从脚本文件中读取awk命令
-F 自定义分隔符
-v 自定义变量

内置变量

变量描述
$n当前记录的第n个字段,字段间由FS分隔
$0完整的输入记录
ARGC命令行参数的数目
ARGIND命令行中当前文件的位置(从0开始算)
ARGV包含命令行参数的数组
CONVFMT数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO最后一个系统错误的描述
FIELDWIDTHS字段宽度列表(用空格键分隔)
FILENAME当前文件名
FNR各文件分别计数的行号
FS字段分隔符(默认是任何空格)
IGNORECASE如果为真,则进行忽略大小写的匹配
NF一条记录的字段的数目
NR已经读出的记录数,就是行号,从1开始
OFMT数字的输出格式(默认值是%.6g)
OFS输出字段分隔符,默认值与输入字段分隔符一致。
ORS输出记录分隔符(默认值是一个换行符)
RLENGTH由match函数所匹配的字符串的长度
RS记录分隔符(默认是一个换行符)
RSTART由match函数所匹配的字符串的第一个位置
SUBSEP数组下标分隔符(默认值是/034)

常用方法

示例文本

[root@centos ~]# cat test
abc 123
def:456
bbb-789
#输出以:为分隔符的第一列
awk -F: '{print $1}'
#只输出行号
awk -F: '{print NR}'
#输出本行有多少列
awk -F: '{print NF}'

BEGIN和END用法

#在处理之前输出aaa,不管awk有没有处理内容
[root@centos ~]# awk 'BEGIN {print "aaa"}' test
aaa
#在处理之后输出aaa,不管awk有没有处理内容
[root@centos ~]# awk '{print $1} END {print "end"}' test
abc
def:456
bbb-789
end
#BEGIN和END一起用
[root@centos ~]# awk 'BEGIN {print "start"}{print $1} END {print "end"}' test
start
abc
def:456
bbb-789
end
[root@centos ~]#

分隔符,用于多个列之间的分隔

#指定内置变量OFS的分隔符
[root@centos ~]# awk -F: -v OFS="---" '{print $1,$2}' test
abc 123---
def---456
bbb-789---
#指定FS分隔符和OFS输出字段分隔符
[root@centos ~]# awk -v FS=":" -v OFS="---" '{print $1,$2}' test
abc 123---
def---456
bbb-789---
[root@centos ~]#

变量FILENAME

#FILENAME是文件名,FNR是awk处理的每个文件的行号,awk可以处理多个文件
[root@centos ~]# awk '{print FILENAME, FNR, $0}' test
test 1 abc 123
test 2 def:456
test 3 bbb-789
[root@centos ~]#

变量ORS

#定义输出换行符
[root@centos ~]# awk -v ORS="+" '{print $1}' test
abc+def:456+bbb-789+[root@centos ~]#
[root@centos ~]#

变量ARGC和ARGV

#ARGV是一个包含所有参数的数组,第一个参数是awk命令本身,ARGC是参数的数量
[root@centos ~]# awk 'BEGIN{print "aaa", ARGV[0], ARGV[1], ARGV[2], ARGC}' test
aaa awk test  2
[root@centos ~]#

自定义变量

[root@centos ~]# awk -v myvar="testvar" 'BEGIN{print myvar}'
testvar
#也可以这样
[root@centos ~]# awk 'BEGIN{myvar1="aaa"; myvar2="bbb"; print myvar1, myvar2}'
aaa bbb
[root@centos ~]#

逻辑表达式

#输出列数为2的行
[root@centos ~]# awk 'NF==2 {print $0}' test
abc 123
#输出列数大于2的行
[root@centos ~]# awk 'NF>=2 {print $0}' test
abc 123
#输出第二列值为123的行
[root@centos ~]# awk '$2==123 {print $0}' test
abc 123
[root@centos ~]#

内嵌循环

#for循环
[root@centos ~]# awk 'BEGIN{for(i=1;i<=3;i++){print i}}'
1
2
3
#while循环
[root@centos ~]# awk -v i=1 'BEGIN{while(i<=3){print i;i++}}'
1
2
3
#continue
[root@centos ~]# awk 'BEGIN{for(i=1;i<6;i++){if(i==3){continue};print i}}'
1
2
4
5
[root@centos ~]#

流程控制

#if
[root@centos ~]# awk -F: '{if($3>$4){print "大于"}else{print "小于或等于"}}' /etc/passwd
#每隔5行,打印一行横线
[root@centos ~]# awk -F: '{if(NR%5==0){print "----------"}print $0}' /etc/passwd
赞(0)
未经允许不得转载:娃哈哈好喝 » awk常用方法
分享到: 更多 (0)