前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell awk内置函数-shell基础

shell awk内置函数-shell基础

原创
作者头像
eisc
修改2021-04-20 17:49:09
2.1K0
修改2021-04-20 17:49:09
举报
文章被收录于专栏:linux 自动化运维

# 算数函数

# 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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档