AWK内置变量表
变量 |
概述 |
$0 |
记录当前文本的所有域 |
$1 |
记录域中的第一列 |
FS |
输入字段分隔符默认是空格 |
OFS |
输出字段分隔符默认是空格 |
NF |
读取文本的域的个数,以列计算,默认是空格 |
NR |
读取文本中的行号从1开始 |
FNR |
记录文本中的的行号,但在多文本下才生效 |
RS |
记录输入的符号,默认是换行 |
ORS |
输出的符号,默认是换行 |
ARGC |
除-v -F以外的所有参数的个数 |
ARGV |
参数的数组 |
FILENAME |
获取参数的文件名 |
IGNORECASE |
指定参数为真,忽略大小写 |
ENVIRON |
获取linux变量信息 |
FIELDWIDTHS |
以宽度为分隔符 |
OFMT |
输出数据格式设置,默认是%.6g |
RSTART |
匹配正则表达式数据的位置 |
RLENGTH |
匹配正则表达式数据的长度 |
SUBSEP |
数组中多个下标的分隔符,默认为"\034" |
文件内容如下:
37.0
37.0
38.0
39.0
40.1
35.0
36.0
$0记录当前文件的所有域,并输出
[root@localhost ~]# awk '{print $0}' cc
37.0
37.0
38.0
39.0
40.1
35.0
36.0
$1,在FS指定下,输出第一列
[root@localhost ~]# awk 'BEGIN{FS="."}{print$1}' cc
37
37
38
39
40
35
36
如果我不使用BEGIN 那么输出结果如下,这是因为FS是在第一个“.”以后才开始生效
[root@localhost ~]# awk '{FS=".";print $1}' cc
37.0
37
38
39
40
35
36
FS输入字段分隔符默认是空格。这里FS你可以根据文本类型指定分隔符,在不指定的情况下输出$1
[root@localhost ~]# awk '{print $1}' cc
37.0
37.0
38.0
39.0
40.1
35.0
36.0
OFS输出字段分隔符默认是空格,要想使OFS生效,不能使用$0,必须指定域
[root@localhost ~]# awk'BEGIN{FS=".";OFS="!!!!"}{print $1,$2}' cc
37!!!!0
37!!!!0
38!!!!0
39!!!!0
40!!!!1
35!!!!0
36!!!!0
NF读取域的个数以列计算默认是空格
[root@localhost ~]# awk 'BEGIN{FS="."}{printNF}' cc
2
2
2
2
2
2
2
NR读取文本的行数,从1开始
[root@localhost ~]# awk 'BEGIN{FS="."}{printNR}' cc
1
2
3
4
5
6
7
FNR记录文本的行号,多文本同时操作下使用生效,下面我打开cc两个文本,然后输出的结果
[root@localhost ~]# awk 'BEGIN{FS="."}{print"NR="NR,"FNR="FNR}' cc cc
NR=1 FNR=1
NR=2 FNR=2
NR=3 FNR=3
NR=4 FNR=4
NR=5 FNR=5
NR=6 FNR=6
NR=7 FNR=7
NR=8 FNR=1
NR=9 FNR=2
NR=10 FNR=3
NR=11 FNR=4
NR=12 FNR=5
NR=13 FNR=6
NR=14 FNR=7
RS记录文本域的分隔符,默认是换行,指定后\n也不会消失,实际的用法RS应该是对行去处理的,下面的例子已经抛弃了RS愿意,程序成了替换。
[root@localhost ~]# awk'BEGIN{RS=".";ORS="|"}{print $0}' cc
37|0
37|0
38|0
39|0
40|1
35|0
36|0
下面是RS真正的含义。
[root@localhost ~]# echo "a b c d;1 2 3 4#1 35" | awk 'BEGIN{ RS="[;#]"} {print NR "--"$0}'
1--a b c d
2--1 2 3 4
3--1 3 5
ORS输出符号,默认是换行,将域中最后一个\n作为 “|” 打印
[root@localhost ~]# awk '{ORS="|"}{print $0}'cc
37.0|37.0 |38.0|39.0|40.1|35.0|36.0|
ARGC除-v -F以外的所有参数的个数,ARGC=2,表示有俩个参数
[root@localhost ~]# awk 'BEGIN{FS=".";print"ARGC="ARGC}' cc
ARGC=2
下面使用ARGV将ARGC中的值一次打印出,ARGV是参数的数组
[root@localhost ~]# awk 'BEGIN{FS=".";print"ARGC="ARGC;for( k in ARGV ){print k"="ARGV[k]}}' cc
ARGC=2
0=awk
1=cc
FILENAME获取参数的名字,以"."作为分隔符,显示cc里的记录是那个文件名称
[root@localhost ~]# awk 'BEGIN{FS="."}{printFILENAME}' cc
cc
cc
cc
cc
cc
cc
cc
IGNORECASE如果参数为真也就是1时,则忽略大小写
[root@localhost ~]# echo "AAAAAA" | awk 'BEGIN{IGNORECASE=1}{$0=="aaaaaa"}{print$0}'
AAAAAA
ENVIRON获取linux变量信息
[root@localhost ~]# awk 'BEGIN{printENVIRON["PATH"];}'
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
FIEDWIDTHS以宽度没分隔符,必须指定某个域,不能为$0否则不生效
[root@localhost ~]# echo "1234567890" | awk'BEGIN{FIELDWIDTHS="5 5"}{print $1"-"$2}'
12345-67890
OFMT设置数字的输出格式,
[root@localhost ~]# awk'BEGIN{OFMT="%.3f";print 2/3}'
0.667
RSTATE,RLENGTH匹配正则表达式数的位置,并且统计长度,下面的例子中,匹配到t开头是3,包含空格并且统计字段的长度。
[root@localhost ~]# awk 'BEGIN{a=match("1thisisatest 123",/[a-z]+/);printa,RSTART,RLENGTH}'
3 3 11
以上例子中我在做个修改,将字符串后面的123替换为字母如下,答案是一样的,因为他计算的是匹配到的第一个字母开头的字符串,空格相当分隔符
[root@localhost ~]# awk 'BEGIN{a=match("1thisisatest asdasd",/[a-z]+/);printa,RSTART,RLENGTH}'
3 3 11
在来一个例子加上$后,匹配和统计最后一个字符串的首行字母的位置,和长度。
[root@localhost ~]# awk 'BEGIN{a=match("1thisisatest asdasd",/[a-z]+$/);print a,RSTART,RLENGTH}'
16 16 6