linux awk 处理字符串,awk 字符串与算数处理

格式化输出

awk提供两个高级输出函数printf和sprintf,他们提供了格式化输出功能。

- printf函数将格式化字符串打印到标准输出(stdout)

- sprintf 函数则返回“可以赋值给变量的字符串”

eg.

print.awk

# printf & sprintf

{

# 第一个字段

x=$1

b="foo"

# 格式化输出

printf("%s got a %d on last test\n","Jim",83)

# 将格式化的字符串赋给变量

myout=sprintf("%s - %d",b,x)

# 简单输出,自带换行

print myout

}

echo100|awk-f print.awk

Jim got a 83 on last test foo - 100

格式化输出支持的转义字符(格式说明符)

c    ACII字符(char型)

s字符串

d十进制整数

ld十进制长整形

u十进制无符号整数

lu十进制无符号长整数

x十六进制整数

lx十六进制长整数

o八进制整数

lo八进制长整数

e用科学计数法表示的浮点数

f浮点数

g选e/f中较短的一种

5491538fdbdcb9f8d48a92b51ce2a7bc.png

awk还支持一些修饰符,这些修饰符跟在‘%’后面,出现在格式说明符之前,可以规定输出域的宽度和对齐方式。

printf的修饰符

-左对齐修饰符

#    显示8进制数时在前面加个0;16进制数时在前面加个0x

+显示使用的d、e、f、g格式的整数时,前面加上正负号(+/-)

0用0而不是空白来填充所显示的值

5491538fdbdcb9f8d48a92b51ce2a7bc.png

格式说明符和修饰符的使用方法:

%-width.precision format-specifier

eg.

%10s   // 默认右对齐; 10:输出字段的域长度至少10个字符,不够10个,空白补齐;多余10个时,原样输出

%-10s // 同上,- 表示输出左对齐

%10.5f  // 字段输出至少10个字符宽度;5-小数点后5位

字符串函数

1. 子字符串查找

index(str,subsr)  返回子串subsr在串str中第一次出现的索引(起始位置),index函数字符串的开始位置为1.(C语言为0)

2. 子字符串提取

substr(str,position[,length]) 返回str中position位置开始的length个字符;缺省length时,返回positio位置开始的所有字符。

eg.

awk '{print substr($1,3)}'  // 提取第一个域中从第三个字符起的所有字符

awk '{print substr($1,5,9)}'  // 提取第一个域中从第5个字符起的后面9个字符

3. 字符串匹配

match(string,/regexp/) 如果在string中找到匹配正则/regexp/的子字符串,则返回子字符串的起始位置,无法匹配,则返回0

区别: index()函数查找固定字符串的位置,match()支持正则匹配!

match()函数会影响两个系统变量:

RSTART :运行match()后,被设置为匹配上正则表达式的子字符串的起始位置。

RLENGTH:运行match()后,被设置为匹配上正则表达式的子字符串的长度。

若无法匹配,RSTART被设置为0,RLENGTH被设置为-1。

4. 子字符串替换

sub(regexp,replacement,target)

将target与正则表达式regrxp进行匹配,只替换匹配到的第一个字符串;如果target没有给定,则sub函数默认使用整个记录。

gsub(regexp,replacement,target)

// gsub()函数替换所有匹配到的字符串

5.大小写转换

tolower(string)   将输入文本转为小写

toupper(string)   将输入文本转为大写

6. 字符串分割

split(string,array,regexp)字符串分割函数

将string切割为片段,并存储到数组里,分割字符串时的分隔符由正则regexp指定,省略regexp时默认为FS(空格).

eg.1

[root@web1 test]#cat split.awk

# awk 字符串分隔函数

{

print"\nField seperator = FS \" "FS" \""

n=split($0,array) // 默认使用 空格 为字段分隔符

for(k=1;k<=n;k++) // split函数返回分割后的字符串的个数

{

print"array[k] = "array[k]

}

}

5491538fdbdcb9f8d48a92b51ce2a7bc.png

[root@web1 test]#echo"dfssfs sdf dsf dsf "|awk-f split.awk

Fieldseperator=FS" "

array[k]=dfssfs

array[k]=sdf

array[k]=dsf

array[k]=dsf

eg.2

[root@web1 test]#cat split.awk

# awk 字符串分隔函数

{

print"\nField seperator = :"

n=split($0,array,":") // 指定分隔符为 ":"

for(k=1;k<=n;k++)

{

print"array[k] = "array[k]

}

}

[root@web1 test]#head-n2/etc/passwd|awk-f split.awk

Fieldseperator=:

array[k]=root

array[k]=x

array[k]=0

array[k]=0

array[k]=root

array[k]=/root

array[k]=/bin/bash

Fieldseperator=:

array[k]=bin

array[k]=x

array[k]=1

array[k]=1

array[k]=bin

array[k]=/bin

array[k]=/sbin/nologin

5491538fdbdcb9f8d48a92b51ce2a7bc.png

split("",array) // 快速清空数组

7. 字符串重建

eg.1

[root@web1 test]#awk'BEGIN{ s1 = "hello "; s2 = "ollir "; s = s1 s2 ; print s}'

hello ollir

a4a1450dcde28fa053c2e2047f04d6bb.png

[root@web1 test]#awk'BEGIN{ s1 = "hello "; s2 = "ollir "; s = sprintf("%s%s",s1 ,s2); print s}'

hello ollir

算术函数

1.常用函数

三角函数sin()、cos()  // 输入参数为弧度角,不是30°之类的角度,要转化为弧度

atan(x,y)  // x,y范围内的余切

exp(x)     // 以e为底数的指数

log()    // 自然对数

sqrt()  // 平方根

2.取整函数

int() 取实型数字的整数部分,直接忽略小数部分

eg.

printint(10.6)

10

3.随机数

rand() 生成一个0-1之间的浮点型随机数

srand(x)为随机数发生器设置一个种子,种子数值为x,如果x未传入参数,则srand()函数将当前时间作为种子。

如果没有调用srand()来设置随机种子的话,awk在开始执行程序前默认以某个常量作为参数调用srand(),使得程序每次运行时都以同一个随机种子开始,这样使得所得的随机数序列每次运行都相同,这可以用于重复测试相同的操作。

eg.

[root@web1 test]#cat rand.awk

BEGIN{

# 没有显式调用srand()设置种子,awk使用默认常量作为参数传入srand()设置固定的种子

print rand() // 随机数固定

print rand()

# srand()使用当前时间作为参数上设置种子

srand()

print rand() //随机数与当前时间有关

print rand()

}

{}

[root@web1 test]#echo""|awk-f rand.awk

0.237788

0.291066

0.0421086

0.447394

[root@web1 test]#echo""|awk-f rand.awk

0.237788

0.291066

0.874176

0.562551

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值