awk的基本结构及常用内置参数演示

版权声明:©来自CSDN博客作者"李在奋斗"的原创作品,如需转载,请注明出处 https://blog.csdn.net/qq_31725371/article/details/83833053

awk脚本是由模式和操作组成的

//模式可以是:
1. /正则表达式/ 如下:匹配含有root的行
[root@mysql-master ~]# awk '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@mysql-master ~]# 

2. 关系表达式:使用运算符进行操作,可以是字符串或数字的比较例如
[root@mysql-master ~]# awk 'BEGIN{print 1/2}'
0.5
[root@mysql-master ~]# 

3. 模式匹配表达式:~(匹配) !~(不匹配)
[root@mysql-master ~]# awk 'BEGIN{a="IamCharacter";if(a ~ /ter$/){print a;}}'
IamCharacter
[root@mysql-master ~]# 

常用命令

-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{ }语句块

例:
[root@mysql-master ~]# cat /etc/passwd|head -3 > /tmp/file1 
[root@mysql-master ~]# 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!!!
[root@mysql-master ~]# 

例1:BEGIN发生在行处理之前,可以定义一些变量(FS:字段分隔符,OFS输出字段分隔符)
[root@mysql-master ~]# awk 'BEGIN{FS=":"} /sbin/{print $1,$3}' /tmp/file1  #匹配含有sbin的行,输出第一和第三个字符串
bin 1
daemon 2
[root@mysql-master ~]# awk 'BEGIN{FS=":";OFS="----"} {print $1,$2}' /tmp/file1 
root----x
bin----x
daemon----x
[root@mysql-master ~]# 

例2 :当print的参数是以逗号进行分隔时,打印时则以默认的OFS参数为输出字段分隔符(默认是空格)。在awk的print语句块中双引号是被当作拼接符使用
[root@mysql-master ~]# awk -F":" '{print $1"----"$2"----"$3}' /tmp/file1 
root----x----0
bin----x----1
daemon----x----2
//这里修改OFS的默认分隔符为“----”
[root@mysql-master ~]# awk -F":" 'BEGIN{OFS="----"} {print $1,$2,$3}' /tmp/file1 
root----x----0
bin----x----1
daemon----x----2
[root@mysql-master ~]# 

例3:NR代表行序,NF代表列序
[root@mysql-master /tmp]# awk -F: '{print "line: "NR",column: "NF}' file1 
line: 1,column: 7
line: 2,column: 7
line: 3,column: 7
[root@mysql-master /tmp]# 

//使用print $NF可以打印出一行中的最后一个字段,使用$(NF-1)则是打印倒数第二个字段;NR==2则可以选择第二行
[root@mysql-master ~]# df -h|grep '/$' |awk '{print $(NF-1)}'
12%
[root@mysql-master ~]# ifconfig eth0|awk 'NR==2' |awk  '{print $2}'
192.168.1.16
[root@mysql-master ~]# 


例4:RS代表输入记录分隔符,ORS表示输出记录分隔符(默认值都是一个换行符)
[root@mysql-master /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 
[root@mysql-master /tmp]# 
#通过改变输入输出记录分隔符实现替换的效果
[root@mysql-master /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
---[root@mysql-master /tmp]# 


猜你喜欢

转载自blog.csdn.net/qq_31725371/article/details/83833053