# 算数函数
# awk 使用外部变量的值 用符号引用,内双引号,外单引号: ' "" '
awk 'BEGIN {
PI = 3.14159265 # 参数1. 圆周率
x = -10 # 参数2.x轴线长度
y = 10
result = atan2 (y,x) * 180 / PI; # 【 正切公式 】:x/y的反正切,result [rɪzʌlt] 结果
printf " PI的值为:%f, x为:%f result的值为:%f 打印字符串结束,百分号f是获取后面变量的值\n", x, y, result
}' # print 打印字符串,和变量
# %f 是打印后面变量的值,
# 第一个%f 对应 x ; 第二个%f对应 y ; 第三个对应 result
# 只用两个参数圆周率和弧度:PI , param
result = cos(param * PI / 180.0); # 【 余弦公式 】:cos( x ) 返回 x 的余弦;x 是弧度
result = sin(param * PI /180) # 【 正弦公式 】:sin(x) 其中 x 是弧度
# 只有1个参数的计算; 定义param的值参与计算:
result = exp(param); # 【 次幂 】: exp(x) 返回 x 幂函数
result = log (param) # 【 自然对数 】: log(x) 返回 x 的自然对数
result = sqrt(param) # 【 x的平方根 】
result = int(param) # 【 int取整数,去尾法 】
print "Random num1 =" , rand() # 【 rand() 返回任意数字 】
awk 'BEGIN {
param = 10
printf "srand() = %d\n", srand()
printf "srand(%d) = %d\n", param, srand(param)
}'
# 将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种 子值。
# 字符串函数,格式化字符串
awk 'BEGIN {
str = "Hello to World"
gsub("World", "文本", str) # gsub() 全局替换( global substitution )的缩写。str 是 变量字符串
# 前一个为匹配,后一个为替换后的字符串 ,str为被修改的变量
# sub() 子串替换函数:函数执行一次
subs = substr(str, 1, 5) # substr()截取字符串函数:截取str变量中字符串,位置从1 开始数数到第5个数
print "长度为:", length(str) # length() 长度函数:从str 源字符串中
print "修改后为: " str # 打印字符串,加被程序替换了的字符串变量
}'
str1=`echo $er | awk '{c1='"c1"'; print substr($0,1,9)}'` ; echo $str1
# substr()截取范围字符串函数
# 定义变量str 为:打印二进制变量er 然 后管道(并且规则) # awk'{ }' 函数:内部变量c引用外部变量c用符号 '" "' ;
# print 打印 substr($0,1,9) 截取范围字符串,$0所有字符串,1为从1开始,后面的9位数
a = "to" # 定义变量:需要查找的字符串的位置
b = index(str, a) # index(); match() 查找位置角标函数
# 从str变量源字符串中,a变量的字符串位 置
printf "第一个变量字符串: %s 发现: %d 位置 \n", a, b
#!/bin/bash
awk 'BEGIN {
str = "One,Two,Three,Four"
split(str, arr, ",") # split() 分割元素
# str源字符串,新字符串变量为 arr,分隔符逗号: ,
for (i in arr) { # 将变量 i 赋值为:arr 字符串
print arr[i] # 将循环的变量i 为数组角标数数自加加
}
}'
tolower(str) # 将大写变量字符串$str全部改为小写字母
toupper(str) # 将小写变量字符串$str全部改为小写字母
sprintf(str) # 格式化字符串
strtonum(str) # 如果字符串以 0 开始,则将其当作十进制数;
# 如果字符串以 0x 或 0X 开始,则将其当 作十六进制数;
# 否则,将其当作浮点数。
============ 实际运用
awk 'BEGIN{b="this 2012";gsub(/[0-9]+/,"||",b);print b}'
# gsub() 替换:定义变量字符串b并赋值, 符号+为选择所有
# 匹配0-9的替换为所有数字替换为符号 || ,从b变量里面
awk 'BEGIN{b="this 2012"; print index(b,"2012")? "ok" : "no found";}'
# index() 查找字符串,从变量b里,找2012
# 符号 ? 存在打印ok ; 符号 : 另一种 情况分隔符,为no
print match(b,/[0-9]+/)? # match() 正则表达式查找,从变量字符串info里,找0-9的所有
# ? 找到就打印ok; 冒号:其他情况打印no
print substr(b,4,10); # 直接查找打印b字符串第4位后面的10个数字字符
c=123143242; str1=`echo $er | awk '{c='"c"'; print substr($0,1,3)}'` ; echo $str1
# awk 引用外部变量 c , 选取数值角标范围
awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}'
# 使用空格切分为动态数组; tA ; awk for in 无 序循环
============== 格式符:格式化字符串输出 =============
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x %X 无符号以十六进制表示的整数
%o 无符号以八进制表示的整数
%g 自动选择合适的表示法
awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%o\n",n1,n2,n3,n1,n1);}'
# 双引号里面是按顺序与后面的变量想对应 ,用逗号隔开
#!/bin/bash
awk 'BEGIN{
a = 20
b = 5.2
h = a**b-a*b
printf "%.100f\n" , h # %f 浮点数(小数),100f 是100位小数,逗号:对应关系 ,格式化谁? 格式化变量 h
}'
a=7; echo $a | awk '{a='"$a"'; printf "000%s",a}'
# 4位整数,前面手动补 0
printf "%09d\n" 123 # 9位整数,自动补0
# 时间函数
====== 时间格式说明符
%a 星期缩写(Mon-Sun)。
%A 星期全称(Monday-Sunday)。
%b 月份缩写(Jan)。
%B 月份全称(January)。
%c 本地日期与时间。
%C 年份中的世纪部分,其值为年份整除100。
%d 十进制日期(01-31)
%D 等价于 %m/%d/%y.
%e 日期,如果只有一位数字则用空格补齐
%F 标准日期格式,等价于 %Y-%m-%d,这也是 ISO 8601
%g ISO8610 标准周所在的年份模除 100(00-99)。比如,1993 年 1 月 1 日属于 1992 年的第 53 周。所以,虽然它是 1993 年第 1 天,但是其 ISO8601 标准周所在年份却是 1992。同样,尽管 1973 年 12 月 31 日属于 1973 年但是它却属于 1994 年的第一周。所以 1973 年 12 月 31 日的 ISO8610 标准周所在的年是 1974 而不是 1973。
%G ISO 标准周所在年份的全称。
%h 等价于 %b.
%H 用十进制表示的 24 小时格式的小时(00-23)
%I 用十进制表示的 12 小时格式的小时(00-12)
%j 一年中的第几天(001-366)
%m 月份(01-12)
%M 分钟数(00-59)
%n 换行符 (ASCII LF)
%p 十二进制表示法(AM/PM)
%r 十二进制表示法的时间(等价于 %I:%M:%S %p)。
%R 等价于 %H:%M。
%S 时间的秒数值(00-60)
%t 制表符 (tab)
%T 等价于 %H:%M:%S。
%u 以数字表示的星期(1-7),1 表示星期一。
%U 一年中的第几个星期(第一个星期天作为第一周的开始),00-53
%V 一年中的第几个星期(第一个星期一作为第一周的开始),01-53。
%w 以数字表示的星期(0-6),0表示星期日 。
%W 十进制表示的一年中的第几个星期(第一个星期一作为第一周的开始),00-53。
%x 本地日期表示
%X 本地时间表示
%y 年份模除 100。
%Y 十进制表示的完整年份。
%z 时区,表示格式为+HHMM(例如,格式要求生成的 RFC 822或者 RFC 1036 时间头)
%Z 时区名称或缩写,如果时区待定则无输出。
awk 'BEGIN {
print "Number of seconds since the Epoch = " mktime("2014 12 14 30 20 10")
# 生成时间格式
# mktime( YYYY MM DD HH MM SS[ DST])
}'
print strftime("当前时间为: %Y年%m月%d日 %H:%M:%S", systime())
# strfime() 格式化时间输出,将时间戳转 为时间字符串
# 年月日对应的%字母成为了变量, 十进制24小时:分钟:秒
# systime() 放置函数但没打印它,变量 %Y 等调用了这个函数的参数
awk 'BEGIN{now=systime();print now}'
# 定义变量now为一个时间函数。并打印
# 位操作函数
左移、右移、按位取反、按位与、按位或、按位异或、数值IP转字符串IP
awk 'BEGIN {
a = 10
printf "lshift(%d) by 1 = %d\n", a, lshift(a, 1)
# left shift [lɛft] [ʃɪft] 左移位(移动)数值变大
# a 的值为10,计算机是二进制数,左移一位乘以2
# echo $[10*(2**2)] 左移动两位
# echo $[10*(2**3)] 左移动3位
# right [rʌɪt] 右,右移位值变小,往小数点右边移动所以变小
# echo $[10/(2**2)] 右移动两位
# echo $[10/(2**3)] 右移动三位
# 注意:舍去小数法取整为2的倍数(能够被二进制整除)
}'
# 算数函数
# awk 使用外部变量的值 用符号引用,内双引号,外单引号: ' "" '
awk 'BEGIN {
PI = 3.14159265 # 参数1. 圆周率
x = -10 # 参数2.x轴线长度
y = 10
result = atan2 (y,x) * 180 / PI; # 【 正切公式 】:x/y的反正切,result [rɪzʌlt] 结果
printf " PI的值为:%f, x为:%f result的值为:%f 打印字符串结束,百分号f是获取后面变量的值\n", x, y, result
}' # print 打印字符串,和变量
# %f 是打印后面变量的值,
# 第一个%f 对应 x ; 第二个%f对应 y ; 第三个对应 result
# 只用两个参数圆周率和弧度:PI , param
result = cos(param * PI / 180.0); # 【 余弦公式 】:cos( x ) 返回 x 的余弦;x 是弧度
result = sin(param * PI /180) # 【 正弦公式 】:sin(x) 其中 x 是弧度
# 只有1个参数的计算; 定义param的值参与计算:
result = exp(param); # 【 次幂 】: exp(x) 返回 x 幂函数
result = log (param) # 【 自然对数 】: log(x) 返回 x 的自然对数
result = sqrt(param) # 【 x的平方根 】
result = int(param) # 【 int取整数,去尾法 】
print "Random num1 =" , rand() # 【 rand() 返回任意数字 】
awk 'BEGIN {
param = 10
printf "srand() = %d\n", srand()
printf "srand(%d) = %d\n", param, srand(param)
}'
# 将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种 子值。
# 字符串函数,格式化字符串
awk 'BEGIN {
str = "Hello to World"
gsub("World", "文本", str) # gsub() 全局替换( global substitution )的缩写。str 是 变量字符串
# 前一个为匹配,后一个为替换后的字符串 ,str为被修改的变量
# sub() 子串替换函数:函数执行一次
subs = substr(str, 1, 5) # substr()截取字符串函数:截取str变量中字符串,位置从1 开始数数到第5个数
print "长度为:", length(str) # length() 长度函数:从str 源字符串中
print "修改后为: " str # 打印字符串,加被程序替换了的字符串变量
}'
str1=`echo $er | awk '{c1='"c1"'; print substr($0,1,9)}'` ; echo $str1
# substr()截取范围字符串函数
# 定义变量str 为:打印二进制变量er 然 后管道(并且规则) # awk'{ }' 函数:内部变量c引用外部变量c用符号 '" "' ;
# print 打印 substr($0,1,9) 截取范围字符串,$0所有字符串,1为从1开始,后面的9位数
a = "to" # 定义变量:需要查找的字符串的位置
b = index(str, a) # index(); match() 查找位置角标函数
# 从str变量源字符串中,a变量的字符串位 置
printf "第一个变量字符串: %s 发现: %d 位置 \n", a, b
#!/bin/bash
awk 'BEGIN {
str = "One,Two,Three,Four"
split(str, arr, ",") # split() 分割元素
# str源字符串,新字符串变量为 arr,分隔符逗号: ,
for (i in arr) { # 将变量 i 赋值为:arr 字符串
print arr[i] # 将循环的变量i 为数组角标数数自加加
}
}'
tolower(str) # 将大写变量字符串$str全部改为小写字母
toupper(str) # 将小写变量字符串$str全部改为小写字母
sprintf(str) # 格式化字符串
strtonum(str) # 如果字符串以 0 开始,则将其当作十进制数;
# 如果字符串以 0x 或 0X 开始,则将其当 作十六进制数;
# 否则,将其当作浮点数。
============ 实际运用
awk 'BEGIN{b="this 2012";gsub(/[0-9]+/,"||",b);print b}'
# gsub() 替换:定义变量字符串b并赋值, 符号+为选择所有
# 匹配0-9的替换为所有数字替换为符号 || ,从b变量里面
awk 'BEGIN{b="this 2012"; print index(b,"2012")? "ok" : "no found";}'
# index() 查找字符串,从变量b里,找2012
# 符号 ? 存在打印ok ; 符号 : 另一种 情况分隔符,为no
print match(b,/[0-9]+/)? # match() 正则表达式查找,从变量字符串info里,找0-9的所有
# ? 找到就打印ok; 冒号:其他情况打印no
print substr(b,4,10); # 直接查找打印b字符串第4位后面的10个数字字符
c=123143242; str1=`echo $er | awk '{c='"c"'; print substr($0,1,3)}'` ; echo $str1
# awk 引用外部变量 c , 选取数值角标范围
awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}'
# 使用空格切分为动态数组; tA ; awk for in 无 序循环
============== 格式符:格式化字符串输出 =============
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x %X 无符号以十六进制表示的整数
%o 无符号以八进制表示的整数
%g 自动选择合适的表示法
awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%o\n",n1,n2,n3,n1,n1);}'
# 双引号里面是按顺序与后面的变量想对应 ,用逗号隔开
#!/bin/bash
awk 'BEGIN{
a = 20
b = 5.2
h = a**b-a*b
printf "%.100f\n" , h # %f 浮点数(小数),100f 是100位小数,逗号:对应关系 ,格式化谁? 格式化变量 h
}'
a=7; echo $a | awk '{a='"$a"'; printf "000%s",a}'
# 4位整数,前面手动补 0
printf "%09d\n" 123 # 9位整数,自动补0
# 时间函数
====== 时间格式说明符
%a 星期缩写(Mon-Sun)。
%A 星期全称(Monday-Sunday)。
%b 月份缩写(Jan)。
%B 月份全称(January)。
%c 本地日期与时间。
%C 年份中的世纪部分,其值为年份整除100。
%d 十进制日期(01-31)
%D 等价于 %m/%d/%y.
%e 日期,如果只有一位数字则用空格补齐
%F 标准日期格式,等价于 %Y-%m-%d,这也是 ISO 8601
%g ISO8610 标准周所在的年份模除 100(00-99)。比如,1993 年 1 月 1 日属于 1992 年的第 53 周。所以,虽然它是 1993 年第 1 天,但是其 ISO8601 标准周所在年份却是 1992。同样,尽管 1973 年 12 月 31 日属于 1973 年但是它却属于 1994 年的第一周。所以 1973 年 12 月 31 日的 ISO8610 标准周所在的年是 1974 而不是 1973。
%G ISO 标准周所在年份的全称。
%h 等价于 %b.
%H 用十进制表示的 24 小时格式的小时(00-23)
%I 用十进制表示的 12 小时格式的小时(00-12)
%j 一年中的第几天(001-366)
%m 月份(01-12)
%M 分钟数(00-59)
%n 换行符 (ASCII LF)
%p 十二进制表示法(AM/PM)
%r 十二进制表示法的时间(等价于 %I:%M:%S %p)。
%R 等价于 %H:%M。
%S 时间的秒数值(00-60)
%t 制表符 (tab)
%T 等价于 %H:%M:%S。
%u 以数字表示的星期(1-7),1 表示星期一。
%U 一年中的第几个星期(第一个星期天作为第一周的开始),00-53
%V 一年中的第几个星期(第一个星期一作为第一周的开始),01-53。
%w 以数字表示的星期(0-6),0表示星期日 。
%W 十进制表示的一年中的第几个星期(第一个星期一作为第一周的开始),00-53。
%x 本地日期表示
%X 本地时间表示
%y 年份模除 100。
%Y 十进制表示的完整年份。
%z 时区,表示格式为+HHMM(例如,格式要求生成的 RFC 822或者 RFC 1036 时间头)
%Z 时区名称或缩写,如果时区待定则无输出。
awk 'BEGIN {
print "Number of seconds since the Epoch = " mktime("2014 12 14 30 20 10")
# 生成时间格式
# mktime( YYYY MM DD HH MM SS[ DST])
}'
print strftime("当前时间为: %Y年%m月%d日 %H:%M:%S", systime())
# strfime() 格式化时间输出,将时间戳转 为时间字符串
# 年月日对应的%字母成为了变量, 十进制24小时:分钟:秒
# systime() 放置函数但没打印它,变量 %Y 等调用了这个函数的参数
awk 'BEGIN{now=systime();print now}'
# 定义变量now为一个时间函数。并打印
# 位操作函数
左移、右移、按位取反、按位与、按位或、按位异或、数值IP转字符串IP
awk 'BEGIN {
a = 10
printf "lshift(%d) by 1 = %d\n", a, lshift(a, 1)
# left shift [lɛft] [ʃɪft] 左移位(移动)数值变大
# a 的值为10,计算机是二进制数,左移一位乘以2
# echo $[10*(2**2)] 左移动两位
# echo $[10*(2**3)] 左移动3位
# right [rʌɪt] 右,右移位值变小,往小数点右边移动所以变小
# echo $[10/(2**2)] 右移动两位
# echo $[10/(2**3)] 右移动三位
# 注意:舍去小数法取整为2的倍数(能够被二进制整除)
}'
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。