AWK变量

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

 


你可能感兴趣的:(awk)