- 论坛徽章:
- 0
|
本帖最后由 力哥丶 于 2012-12-05 00:19 编辑
- 变量与用法
- 变量 概述
- $0 记录当前文本(即整个域,单个变量)
- $1 记录域中的第一例(字段有FS分隔, $1~$n)
- FS 输入字段分隔符默认是空格
- OFS 输出字段分隔符默认为空格
- NF 当前记录中的字段个数,以列计算
- NR 已经读出的记录数,就是行号,从1开始
- FNR 当前记录数
- RS 输入的记录他隔符,默认为换行\n
- ORS 输出的记录分隔符默认为换行\n
- ARGC 命令行参数个数
- ARGV 命令行参数数组
- ARGIND 当前被处理文件ARGV的标示符
- FILENAME 当面输入文件的名字
- IGNORECASE 如果为真,则忽略大小写
- CONVFMT 数字转换格式
- ENVIRON UNIX环境变量
- ERRNO UNIX系统错误消息
- FIELDWIDTHS 输入字段宽度空白分割字符串
- OFMT 数字的输入格式
- RSTATE 被匹配函数的首字符串
- RLENGTH 被匹配函数的字符串长度
- SUBSEP \034
- (1)整个域$0
- [root@localhost ~]# awk '/^root/{print $0}' /etc/passwd
- root:x:0:0:root:/root:/bin/bash
- 以passwd文件为例匹配root,并追加root行,如果直接使用$0,将输出整个passwd文件用户。
- (2)字段分隔符FS
- [root@localhost ~]# awk 'BEGIN{FS=":"}/^root/{print $1,$NF}' /etc/passwd
- root /bin/bash
- FS默认是空格,passwd文件里是以:为分隔的。匹配root行并且输出本行的最后一个域NF字段总数,$NF是最后一个字段。
- (3)OFS的使用
- [root@localhost ~]# awk 'BEGIN{FS=":";OFS="^^"}/^root/{print NR,$1,$NF}' /etc/passwd
- 1^^root^^/bin/bash
- OFS是输出字段分隔符,必须要对字段采取操作才会生效,如果将后面的$1修改为$0。OFS将不会生效。
- (4)NR,FNR记录条数
- [root@localhost ~]# awk 'BEGIN{FS=":"}/^root/{print NR,$1,$NF,FNR}' /etc/passwd
- 1 root /bin/bash
- 记录文件的行数,显示$1,和最后一个字段域,FNR在这里没生效,是因为当文件数量超过1的时候FNR才会生效,例如俩个文件中有5行,那么 NR=10, FNR=5,5
- (5)RS,ORS的使用
- [root@localhost ~]$ awk 'BEGIN{FS=":";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是输出字段分隔符。默认是换行,以上将ORS修改为^^,\n换行也就没了。
- (6)获取输入参数ARGC、ARGV
- [root@localhost ~]# awk 'BEGIN{FS=":";print "ARGC="ARGC;for(K in ARGV){print K"="ARGV[K]}}' /etc/passwd
- ARGC=2
- 0=awk
- 1=/etc/passwd
- ARGC 除了 –v –f 以外的都为参数,ARGV是数组,ARGC=2,用K去循环ARGV,并且把训话的值打印出来。
- (7)获取传入的文件名(FILEMANE)
- [root@localhost ~]# awk 'BEGIN{FS=":"}/^root/{print FILENAME}' /etc/passwd
- /etc/passwd
- 获取处理数据的文件名。BEGIN里不能获取任何变量。
- (8)获取linux环境变量(ENVIRON)
- [root@localhost ~]# awk 'BEGIN{print ENVIRON["PATH"];}' /etc/passwd
- /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
- (9)输出数据格式设置(OFMT)
- [root@localhost ~]# awk 'BEGIN{OFMT="%.3f";print 2/3,123.111111;}'
- 0.667 123.111
- OFMT,默认是保留小数点后6位,这里保留三位,并四舍五入。 2/3 2除以3。
- (10)按宽度指定分隔符(FIELDWIDTHS)
- [root@localhost ~]# echo 20121125152222 | awk 'BEGIN{FIELDWIDTHS="4 2 2 2 2 2"}{print $1"-"$2"-"$3,$4":"$5":"$6 }'
- 2012-11-25 15:22:22
- 这里必须要对每个域分隔符进行打印否则不生效。
- (11)被匹配这个测表达式首位 RSTART,匹配字符长度RLENGIH
- [root@localhost ~]# awk 'BEGIN{start=match("this is a test",/[a-z]+$/);print start,RSTART,RLENGTH}'
- 11 11 4、
- 这里用到match函数意思是match(s,r)测试r是否匹配s的字符串,RSTART显示字符串的长度,不包含空格,RLENGIH输出末尾字符的长度,默认是以空格分隔没有则显示-1
复制代码 以上是我自己记录的资料。然后分享下,还有一些例子,有些是参照别人的,有的是我自己写的,有人喜欢搞一些专业名词来让新手晕,那么我给你解释。
|
|