参数
-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