文章目录
-
-
- awk脚本是由模式和操作组成的
- 常用命令
- awk内置变量(预定义变量)
- awk脚本基本结构
awk脚本是由模式和操作组成的
//模式可以是:
1. /正则表达式/ 如下:匹配含有root的行
[[email protected] ~]# awk '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] ~]#
2. 关系表达式:使用运算符进行操作,可以是字符串或数字的比较例如
[[email protected] ~]# awk 'BEGIN{print 1/2}'
0.5
[[email protected] ~]#
3. 模式匹配表达式:~(匹配) !~(不匹配)
[[email protected] ~]# awk 'BEGIN{a="IamCharacter";if(a ~ /ter$/){print a;}}'
IamCharacter
[[email protected] ~]#
常用命令
-F fs fs指定分隔符,可以是字符串或正则表达式
-v var=value 赋值一个用户定义变量,将外部变量传递给awk
-f scripfile 从脚本中读取awk命名
-m[fr] val 对val设置内置限制,-mf选项分配val最大块数目;-mr限制记录的最大数目(在标准wak中不适用)
awk内置变量(预定义变量)
//常用:
NF 表示字段数,在执行过程中对应于当前的字段数
NR 表示记录数,在执行过程中对应于当前的行号
FS 字段分隔符(默认是任何空格)
OFS 输出字段分隔符(默认值是一个空格)
ORS 输出记录分隔符(默认值是一个换行符)
RS 记录分隔符(默认是一个换行符)
ARGC 命令行参数的数目
ARGIND 命令行中当前文件的位置(从0开始算)
ARGV 包含命令行参数的数组
CONVFMT 数字转换格式(默认值为%.6g)
ENVIRON 环境变量关联数组
ERRNO 最后一个系统错误的描述
FIELDWIDTHS 字段宽度列表(用空格键分隔)
FILENAME 当前输入文件的名
FNR 同NR,但相对于当前文件
IGNORECASE 如果为真,则进行忽略大小写的匹配
OFMT 数字的输出格式(默认值是%.6g)
RSTART 由match函数所匹配的字符串的第一个位
RLENGTH 由match函数所匹配的字符串的长度
SUBSEP 数组下标分隔符(默认值是34)
awk脚本基本结构
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
1. 第一步先执行BEGIN{ }语句块
2. 第二步从文件或标准输入(stdin)中读取一行执行pattern{ }语句块,这里会逐行扫描,从第一行到最后一行
3. 当读取到文件或输入流末尾时,执行END{ }语句块
例:
[[email protected] ~]# cat /etc/passwd|head -3 > /tmp/file1
[[email protected] ~]# awk 'BEGIN{print "start!!!"} {print } END{print "end!!!"}' /tmp/file1
start!!!
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
end!!!
[[email protected] ~]#
例1:BEGIN发生在行处理之前,可以定义一些变量(FS:字段分隔符,OFS输出字段分隔符)
[[email protected] ~]# awk 'BEGIN{FS=":"} /sbin/{print $1,$3}' /tmp/file1 #匹配含有sbin的行,输出第一和第三个字符串
bin 1
daemon 2
[[email protected] ~]# awk 'BEGIN{FS=":";OFS="----"} {print $1,$2}' /tmp/file1
root----x
bin----x
daemon----x
[[email protected] ~]#
例2 :当print的参数是以逗号进行分隔时,打印时则以默认的OFS参数为输出字段分隔符(默认是空格)。在awk的print语句块中双引号是被当作拼接符使用
[[email protected] ~]# awk -F":" '{print $1"----"$2"----"$3}' /tmp/file1
root----x----0
bin----x----1
daemon----x----2
//这里修改OFS的默认分隔符为“----”
[[email protected] ~]# awk -F":" 'BEGIN{OFS="----"} {print $1,$2,$3}' /tmp/file1
root----x----0
bin----x----1
daemon----x----2
[[email protected] ~]#
例3:NR代表行序,NF代表列序
[[email protected] /tmp]# awk -F: '{print "line: "NR",column: "NF}' file1
line: 1,column: 7
line: 2,column: 7
line: 3,column: 7
[[email protected] /tmp]#
//使用print $NF可以打印出一行中的最后一个字段,使用$(NF-1)则是打印倒数第二个字段;NR==2则可以选择第二行
[[email protected] ~]# df -h|grep '/$' |awk '{print $(NF-1)}'
12%
[[email protected] ~]# ifconfig eth0|awk 'NR==2' |awk '{print $2}'
192.168.1.16
[[email protected] ~]#
例4:RS代表输入记录分隔符,ORS表示输出记录分隔符(默认值都是一个换行符)
[[email protected] /tmp]# awk 'BEGIN{ORS=" "} {print $0}' file1 #将文件以空格连接成一行
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
[[email protected] /tmp]#
#通过改变输入输出记录分隔符实现替换的效果
[[email protected] /tmp]# awk 'BEGIN{RS=":";ORS="---"} {print $0}' file1
root---x---0---0---root---/root---/bin/bash
bin---x---1---1---bin---/bin---/sbin/nologin
daemon---x---2---2---daemon---/sbin---/sbin/nologin
---[[email protected] /tmp]#