linux awk 内置变量使用介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux awk 内置变量使用介绍相关的知识,希望对你有一定的参考价值。

参考技术A   一、内置变量表
属性
说明
$0
当前记录(作为单个变量)
$1~$n
当前记录的第n个字段,字段间由FS分隔
FS
输入字段分隔符
默认是空格
NF
当前记录中的字段个数,就是有多少列
NR
已经读出的记录数,就是行号,从1开始
RS
输入的记录他隔符默
认为换行符
OFS
输出字段分隔符
默认也是空格
ORS
输出的记录分隔符,默认为换行符
ARGC
命令行参数个数
ARGV
命令行参数数组
FILENAME
当前输入文件的名字
IGNORECASE
如果为真,则进行忽略大小写的匹配
ARGIND
当前被处理文件的ARGV标志符
CONVFMT
数字转换格式
%.6g
ENVIRON
UNIX环境变量
ERRNO
UNIX系统错误消息
FIELDWIDTHS
输入字段宽度的空白分隔字符串
FNR
当前记录数
OFMT
数字的输出格式
%.6g
RSTART
被匹配函数匹配的字符串首
RLENGTH
被匹配函数匹配的字符串长度
SUBSEP
34
  2、实例
  1、常用操作
  代码如下:
  [chengmo@localhost
~]$
awk
'/^root/print
$0'
/etc/passwd
  root:x:0:0:root:/root:/bin/bash
  /^root/
为选择表达式,$0代表是逐行
  2、设置字段分隔符号(FS使用方法)
  代码如下:
  [chengmo@localhost
~]$
awk
'BEGINFS=":"/^root/print
$1,$NF'
/etc/passwd
  root
/bin/bash
  FS为字段分隔符,可以自己设置,默认是空格,因为passwd里面是”:”分隔,所以需要修改默认分隔符。NF是字段总数,$0代表当前行记录,$1-$n是当前行,各个字段对应值。
  3、记录条数(NR,FNR使用方法)
  代码如下:
  [chengmo@localhost
~]$
awk
'BEGINFS=":"print
NR,$1,$NF'
/etc/passwd
  1
root
/bin/bash
  2
bin
/sbin/nologin
  3
daemon
/sbin/nologin
  4
adm
/sbin/nologin
  5
lp
/sbin/nologin
  6
sync
/bin/sync
  7
shutdown
/sbin/shutdown
  ……
  NR得到当前记录所在行
  4、设置输出字段分隔符(OFS使用方法)
  代码如下:
  [chengmo@localhost
~]$
awk
'BEGINFS=":";OFS="^^"/^root/print
FNR,$1,$NF'
/etc/passwd
  1^^root^^/bin/bash
  OFS设置默认字段分隔符
  5、设置输出行记录分隔符(ORS使用方法)
  代码如下:
  [chengmo@localhost
~]$
awk
'BEGINFS=":";ORS="^^"print
FNR,$1,$NF'
/etc/passwd
  1
root
/bin/bash^^2
bin
/sbin/nologin^^3
daemon
/sbin/nologin^^4
adm
/sbin/nologin^^5
lp
/sbin/nologin
  从上面看,ORS默认是换行符,这里修改为:”^^”,所有行之间用”^^”分隔了。
  6、输入参数获取(ARGC
,ARGV使用)
  代码如下:
  [chengmo@localhost
~]$
awk
'BEGINFS=":";print
"ARGC="ARGC;for(k
in
ARGV)
print
k"="ARGV[k];
'
/etc/passwd
  ARGC=2
  0=awk
  1=/etc/passwd
  ARGC得到所有输入参数个数,ARGV获得输入参数内容,是一个数组。
  7、获得传入的文件名(FILENAME使用)
  代码如下:
  [chengmo@localhost
~]$
awk
'BEGINFS=":";print
FILENAMEprint
FILENAME'
/etc/passwd
  /etc/passwd
  FILENAME,$0-$N,NF
不能使用在BEGIN中,BEGIN中不能获得任何与文件记录操作的变量。
  8、获得linux环境变量(ENVIRON使用)
  代码如下:
  [chengmo@localhost
~]$
awk
'BEGINprint
ENVIRON["PATH"];'
/etc/passwd
  /usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/lib/ccache:/usr/lib/icecc/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbi
n:/usr/java/jdk1.5.0_17/bin:/usr/java/jdk1.5.0_17/jre/bin:/usr/local/mysql/bin:/home/web97/bin
  ENVIRON是子典型数组,可以通过对应键值获得它的值。
  9、输出数据格式设置:(OFMT使用)
  代码如下:
  [chengmo@localhost
~]$
awk
'BEGINOFMT="%.3f";print
2/3,123.11111111;'
/etc/passwd
  0.667
123.111
  OFMT默认输出格式是:%.6g
保留六位小数,这里修改OFMT会修改默认数据输出格式。
  10、按宽度指定分隔符(FIELDWIDTHS使用)
  复制代码
  代码如下:
  [chengmo@localhost
~]$
echo
20100117054932
|
awk
'BEGINFIELDWIDTHS="4
2
2
2
2
3"print
$1"-"$2"-"$3,$4":"$5":"$6'
  2010-01-17
05:49:32
  FIELDWIDTHS其格式为空格分隔的一串数字,用以对记录进行域的分隔,FIELDWIDTHS="4
2
2
2
2
2"就表示$1宽度是4,$2是2,$3是2
....
。这个时候会忽略:FS分隔符。
  11、RSTART
RLENGTH使用
  代码如下:
  [chengmo@localhost
~]$
awk
'BEGINstart=match("this
is
a
test",/[a-z]+$/);
print
start,
RSTART,
RLENGTH
'
  11
11
4
  [chengmo@localhost
~]$
awk
'BEGINstart=match("this
is
a
test",/^[a-z]+$/);
print
start,
RSTART,
RLENGTH
'
  0
0
–1
  RSTART
被匹配正则表达式首位置,RLENGTH
匹配字符长度,没有找到为-1.

  以上是:awk的一些内置变量使用,希望有什么问题可以与我交流。

Linux 8个有力的AWK内置变量

Awk 有几个非常强力的内置变量.通常来说,分为两种类型的内置变量:
第一种是定义的变量可以改变, 比如字段分隔(FS)与记录分隔(RS)
第二种是可以用来数据处理或者数据总结,比如记录数(NR)与字段数目(NF)
本文介绍: FS,OFS, RS, ORS, NR, NR, FNR


(1).FS: 输入字段分隔符变量
FS(Field Separator) 读取并解析输入文件中的每一行时,默认按照空格分隔为字段变量,$1,$2...等。FS 变量被用来设置每一记录的字段分隔符号。FS 可以是任意的字符串或者正则表达式.你可以使用下面两种方式来声名FS:
使用 -F 命令选项
作为设置为普通变量使用
语法:
$ awk  -F  ‘FS‘  ‘commands‘  inputfilename

 

或者
$ awk ‘BEGIN{FS="FS";}‘

FS 可以是任意字符或者正则表达式
FS 可以多次改变, 不过会保持不变直到被明确修改。不过如果想要改变字段分隔符, 最好是在读入文本之前就改变 FS, 这样改变才会在你读入的文本生效。
下面是一个使用 FS 读取 /etc/passwd 以 : 作为分隔符的例子
$ cat etc_passwd.awk

BEGIN{

FS=":";
print "Name UserID GroupID HomeDirectory";
}
{

    print  $1 " " $3 " " $4 " " $6;
}
END {

    print NR,"Records Processed";
}
使用结果:
$ awk -f etc_passwd.awk /etc/passwd

Name UserID GroupID HomeDirectory
gnats    41    41    /var/lib/gnats
libuuid    100    101    /var/lib/libuuid
syslog    101    102    /home/syslog
hplip    103    7    /var/run/hplip
avahi    105    111    /var/run/avahi-daemon
saned    110    116    /home/saned
pulse    111    117    /var/run/pulse
gdm    112    119    /var/lib/gdm

8 Records Processed

(2).OFS: 输出字段分隔符变量
OFS(Output Field Separator) 相当与输出上的 FS, 默认是以一个空格字符作为输出分隔符的,下面是一个 OFS 的例子:
$ awk -F‘:‘ ‘{print $3,$4;}‘ /etc/passwd

41 41
100 101
101 102
103 7
105 111
110 116
111 117
112 119
注意命令中的 print 语句的, 表示的使用一个空格连接两个参数,也就是默认的OFS的值。因此 OFS 可以像下面那样插入到输出的字段之间:
$ awk -F‘:‘ ‘BEGIN{OFS="=";} {print $3,$4;}‘ /etc/passwd

41=41
100=101
101=102
103=7
105=111
110=116
111=117
112=11

(3).RS: 记录分隔符
RS(Record Separator)定义了一行记录。读取文件时,默认将一行作为一条记录。 下面的例子以 student.txt 作为输入文件,记录之间用两行空行分隔,并且每条记录的每个字段用一个换行符分隔:
$ cat student.txt

Jones
2143
78
84
77

Gondrol
2321
56
58
45

RinRao
2122
38
37
65

Edwin
2537
78
67
45

Dayan
2415
30
47
20

然后下面的脚本就会从student.txt输出两项内容:
$ cat student.awk

BEGIN {

    RS=" ";

    FS=" ";
}
{

    print $1,$2;
}

$ awk -f student.awk student.txt

Jones 2143
Gondrol 2321
RinRao 2122
Edwin 2537
Dayan 2415
在 student.awk 中,把每个学生的详细信息作为一条记录, 这是因为RS(记录分隔符)是被设置为两个换行符。并且因为 FS (字段分隔符)是一个换行符,所以一行就是一个字段。

(4).ORS: 输出记录分隔符变量
ORS(Output Record Separator)顾名思义就相当与输出的 RS。 每条记录在输出时候会用分隔符隔开,看下面的 ORS 的例子:
$ awk ‘BEGIN{ORS="=";} {print;}‘ student-marks

Jones 2143 78 84 77=Gondrol 2321 56 58 45=RinRao 2122 38 37 65=Edwin 2537 78 67 45=Dayan 2415 30 47 20=
上面的脚本,输入文件的每条记录被 = 分隔开。 附:student-marks 便是上面的输出.

(5).NR: 记录数变量
NR(Number of Record) 表示的是已经处理过的总记录数目,或者说行号(不一定是一个文件,可能是多个)。下面的例子,NR 表示行号,在 END 部分,NR 就是文件中的所有记录数目。
$ awk ‘{print "Processing Record - ",NR;}END {print NR, "Students Records are processed";}‘ student-marks

Processing Record - 1
Processing Record - 2
Processing Record - 3
Processing Record - 4
Processing Record - 5
5 Students Records are processed

(6).NF:一条记录的记录数目
NF(Number for Field)表示的是,一条记录的字段的数目. 它在判断某条记录是否所有字段都存在时非常有用。 让我们观察 student-mark 文件如下:
$ cat student-marks

Jones 2143 78 84 77
Gondrol 2321 56 58 45
RinRao 2122 38 37
Edwin 2537 78 67 45
Dayan 2415 30 47
接着下面的Awk程序,打印了记录数(NR),以及该记录的字段数目: 因此可以非常容易的发现那些数据丢失了。
$ awk ‘{print NR,"->",NF}‘ student-marks

1 -> 5
2 -> 5
3 -> 4
4 -> 5
5 -> 4

(7).FILENAME: 当前输入文件的名字
FILENAME 表示当前正在输入的文件的名字。 AWK 可以接受读取很多个文件去处理。看下面的例子:
$ awk ‘{print FILENAME}‘ student-marks

student-marks

student-marks

student-marks

student-marks

student-marks
在输入的文件的每一条记录都会输出该名字。

(8).FNR: 当前输入文件的记录数目
当awk读取多个文件时,NR 代表的是当前输入所有文件的全部记录数,而 FNR 则是当前文件的记录数。如下面的例子:
$ awk ‘{print FILENAME, "FNR= ", FNR," NR= ", NR}‘ student-marks bookdetails

student-marks FNR= 1 NR= 1

student-marks FNR= 2 NR= 2

student-marks FNR= 3 NR= 3

student-marks FNR= 4 NR= 4

student-marks FNR= 5 NR= 5

bookdetails FNR= 1 NR= 6
bookdetails FNR= 2 NR= 7
bookdetails FNR= 3 NR= 8
bookdetails FNR= 4 NR= 9
bookdetails FNR= 5 NR= 10
附: bookdetails 与 student-marks 内容一样,作例子. 可以看出来 NR 与 FNR 的区别。
经常使用 NR 与 FNR 结合来处理两个文件,比如有两个文件:
$ cat a.txt

李四|000002
张三|000001
王五|000003
赵六|000004


$ cat b.txt

000001|10
000001|20
000002|30
000002|15
000002|45
000003|40
000003|25
000004|60

如果想作对应的话, 比如张三|000001|10
$ awk -F ‘|‘ ‘NR == FNR{a[$2]=$1;} NR>FNR {print a[$1],"|", $0}‘ a.txt b.txt

张三 | 000001|10
张三 | 000001|20
李四 | 000002|30
李四 | 000002|15
李四 | 000002|45
王五 | 000003|40
王五 | 000003|25
赵六 | 000004|60








































































































































以上是关于linux awk 内置变量使用介绍的主要内容,如果未能解决你的问题,请参考以下文章

Linux 8个有力的AWK内置变量

shell编程

Linux高级文本处理之gawk内置变量

二.AWK内置变量

awk内置变量 awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。

文本处理利器Linux Awk这样入门☛常见变量的使用