您的位置:首页 > 运维架构 > Shell

awk 字符串与算数处理

2016-08-22 20:03 337 查看
格式化输出 

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

    - 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

}


echo 100 | 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中较短的一种

    



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

  

                                   printf的修饰符


  -    左对齐修饰符

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

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

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


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

              %-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]

}

}


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


Field seperator = 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


Field seperator = :

array[k] = root

array[k] = x

array[k] = 0

array[k] = 0

array[k] = root

array[k] = /root

array[k] = /bin/bash


Field seperator = :

array[k] = bin

array[k] = x

array[k] = 1

array[k] = 1

array[k] = bin

array[k] = /bin

array[k] = /sbin/nologin


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

7. 字符串重建

 eg.1 

 

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

hello ollir


[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. 

print int(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  awk awk shell