gawk进阶
-
内建变量
-
在gawk程序内部使用的变量,用于提取和处理数据
-
字段和记录变量(通过在BEGIN设置)
-
FILEDWIDTHS
- 设定字段宽度
-
FS
- 输入字段分隔符(默认空格和制表符)
-
RS
- 输入记录分隔符(默认是换行符)
-
OFS
- 输出字段分隔符
-
ORS
- 输出记录分隔符
-
-
数据变量
-
ARGC
- 统计命令行参数的个数
-
ARGC[0]
- 代表全部命令行参数
-
ARGC[1]
- 代表第一个命令行参数
-
ENVIRON
- 使用关联数组(文本作为索引的数组)提取shell环境变量
-
FNR
- 统计当前文件已处理的记录数
-
NR
- 统计已处理过的记录总数
-
NF
- 统计字段总数和指代最后一个字段
-
-
-
-
数组
-
分类
-
数字数组
- 使用数字作为索引
-
关联数组
- 使用字符串作为索引
-
-
定义数组
-
格式
array[index]=element
-
-
提取数组值
-
单个值
array[index]
-
多个值
-
for (var in array) { print "index=",var ---- "value=", array[var] }
- var存储的是索引值,array[var]存储的是数值-
删除数组变量
-
格式
delete array[index]
-
-
-
模式
-
正则表达式
-
注意事项
- 正则表达式必须出现在它要控制的程序的左花括号前面
-
使用方法
gawk 'BEGIN{FS=","} /xxx/{print $1} ' file
- 以逗号为分隔符,从文件中匹配xxx,如果匹配成功,则打印包含xxx的行的第一个字段
-
-
匹配操作符
-
定义
- 把正则表达式限定在行的特定字段,只从某个字段中匹配
-
格式
gawk '$x ~ /xxx/{xxx}' file
gawk '$x !~ /xxx/{xxx}' file
-
使用方法
gawk 'BEGIN{FS=","} $1 ~ /^xxx/{print $0}' file
- 以逗号为分隔符,从文件中的所有行的第一个字段中查找以xxx开头的字符,如果匹配成功,则打印其所在行的所有内容
gawk -F: '$1 ~ /xxx/{print $1,$NF}' /etc/passwd
- 以分号为分隔符,从/etc/passwd中的第一个字段中查找xxx,如果匹配成功,则打印包含所在行的第一个字段和最后一字段
gawk -F: '$1 !~ /xxx/{print $1,$NF}' /etc/passwd
- 以分号为分隔符,从/etc/passwd中的第一子u按中查找xxx,如果匹配成功,则打印除了xxx所在行的其他行的第一个字段和最后一个字段
-
-
-
数字表达式
-
表达式
-
等号
- ==
-
小于等于
- <=
-
小于
- <
-
大于等于
- >=
-
大于
- >
-
-
使用方法
-
匹配字符(完全匹配)
gawk -F: '$1 == "xxx" {print $1} ' file
- 以分号为分隔符,从文件中的第一个字段中,查找xxx,并打印出来
-
匹配数值
gawk -F: '$4==0{print $1}' /etc/passwd
- 以分号为分隔符,从/etc/passwd中的第4个字段中查找数值等于0的行(root用户组),并打印改该的第一个字段
-
-
-
结构化命令
-
if语句
gawk '{ if (condition) {statement} else {statement} }' file
-
while语句
gawk '{ while (condition) {statement} }' file
-
do..while语句
gawk 'do {statement} while (condition) ' file
-
for语句
gawk ' for (var assignment;conditon ; interation process)' file
-
-
格式化输出
-
printf
-
格式
printf "format string",var1,var2....
-
-
格式化指定符(format string)
-
定义
- 通过控制字母指明变量的类型和如何显示,作为占位符,供变量使用。另外可利用修饰符进一步控制输出
-
格式
% [modified] control-letter
-
控制字母(control-letter)
-
c
- 显示ASCII字符
-
s
- 显示一个字符串
-
i
- 显示一个整数
-
f
- 显示一个浮点数
-
-
修饰符(modifier)
-
width
- 指定输出字段的最小宽度
-
prec
- 指定小数点位数或字符串的字符数
-
-
字符串左对齐
-
-
-
-
使用方法
-
gawk '{ printf %s,var1}' file
- 显示一个字符串
-
gawk '{printf %s\n, %s\n, var1, var2}' file
- 分行显示两个字符串
-
gawk '{printf %-16s\n , var1}' file
- 强制一个字符宽度为16个字符,并且左对齐显示
-
gawk '{printf %5.1f\n,var1}' file
- 显示5个字符,并且保留一位小数点
-
-
-
内建函数
-
数学函数
-
int(x)
- 取整
-
rand(x)
-
生成0到1的随机数(可通过*放大)
-
int( n * rand(x))
- 随机数取整
-
exp(x)
- 计算x的指数
-
位操作函数
-
and(v1,v2)
- v1,v2与运算
-
or(v1,v2)
- v1,v2或运算
-
xor(v1,v2)
- v1,v2异或运算
-
lshift(v1,x)
- v1向左移x位
-
rshift(v1,x)
- v1向右移x位
-
-
字符串函数
-
asort( array1 )
- 把数组array1(按元素值)排序后,索引值被替换成连续数字
-
asorti( array1 )
- 把数组array1(按索引值)排序后,索引值被替换成新的连续数字
-
asort(arary1,array2)
- 把数组array1(按元素值)排序后,索引值被替换成连续数字,并把排序后的的数组存储在array2中
-
asorti(array1,array2)
- 把数组array1(按索引值)排序后,索引值被替换成新的连续数字,并把排序后的数组存储在array2中
-
index(s,x)
- 返回字符串s中,x的索引值,没有结果返回0
-
lenth( [s] )
- 返回字符串s的长度,没有指定s则返回$0的长度
-
split( s,array1)
- 把字符串用FS字符分割后(需要在gawk指定)存储在array1中
-
split( s, array1 , r)
- 把字符串用正则表达式分割后,放到array1中
-
substr(s,m,n)
- 把字符串s从m处开始截取,截取n个长度字符串
-
-
时间函数
-
systime()
- 获取系统当前时间
-
strftime(format [,timestamp] )
- 格式化时间
-
使用方法
-
gawk 'print strftime("%A,%B %d,%Y" , systime())'
- %A为星期x,%B %d为月+天,%Y为年份
-
-
-
-
自定义函数
-
定义函数
-
格式
function name ( [variable] ) { statements }
-
-
使用函数
- 格式
gawk ' fuction myfunction([variable]) { statements } BEGIN{ myfunction() }' file
-