`
xiangzi21
  • 浏览: 30088 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

sed与awk菜鸟的笔记--第九章 函数

阅读更多

第九章 函数

awk有很多内置函数,分为算术函数和字符串函数两种.也可以用户自定义函数.

 

算术函数

cos(x):返回x的余弦(x为弧度)

sin(x)返回x的正弦(x为弧度)

atan2(y,x):返回y/x的反正切,其值在-π到π之间

exp(x):返回e的x次幂

int(x):返回x的整数部分值

log(x):返回x的自然对数(以e为底)

sqrt(x):返回x的平方根

rand():返回伪随机数r,其中0<=r<1

srand(x):建立rand()的新的种子数.如果没有指定种子数,就用当天的时间.返回旧的种子值.

 

 

整数函数

函数int()将小数点后吗的数字舍去,没有四舍五入.(使用printf格式"%.0f"实现四舍五入)

 

$ echo a | awk '{print 10/3}'                    

3.33333

 

$ echo a | awk '{print 8/3}'     

2.66667

 

$echo a | awk '{print int(8/3)}'       

2

 

$ echo a | awk '{printf ("%.0f\n",8/3)}'

3

 

 

随机数的生成

 

如果没有调用srand(),awk在开始执行程序之前默认为以某个参数调用srand(),使得程序在每次运行时都以同一个种子数开始.

这可以用于重复测试相同的操作.

下面例子,如果不指定srand(),每次先运行rand()时都是同一个数.

$ echo a | awk '{print rand();srand();print rand()}'

0.237788

0.772482

 

$ echo a | awk '{print rand();srand();print rand()}'

0.237788

0.265938

 

 

彩票选号(35选7)

下例将实现代码写成awk脚本,用shell脚本调用

awk脚本需要输入两个参数,TOPNUM选NUM(默认35选7)

所有操作要在BEGIN中执行,程序中没有其他语句.所以要用-v指定参数,在完成BEGIN后推出awk.

 

$ cat lotto.sh

#!/bin/bash

awk -v NUM=$1 -v TOPNUM=$2 -f lotto.awk

 

$ cat lotto.awk 

BEGIN{

        if (NUM <= 0)

                NUM = 7

        if (TOPNUM <= 0)

                TOPNUM = 35

        printf("Pick %d of %d\n",NUM,TOPNUM)

        srand()

        for (j = 1; j <=NUM; ++j){

                do {

                        select = 1 + int(rand()*TOPNUM)

                }while (select in pick)

                pick[select] = select

        }

        for (j in pick)

                printf ("%s ",pick[j])

        printf("\n")

}

 

$ sh lotto.sh 7 35

Pick 7 of 35

35 27 18 8 21 23 3 

 

 

字符串函数

 

index(s,t):返回字串t在字符串s中的位置,如果没指定s,则返回0.

length(s):返回字符串s的长度,如果没给出s,则返回$0的长度(即输入行长度).

match(s,r):如果正则表达式r在s中出现,则返回起始位置.如果不匹配,则返回0.设置RSTART和RLENGTH的值.

split(s,a,sep):以分隔符sep将s分解到数组a中,返回元素个数.如果没给sep,默认为FS.

sprintf("fmt",expr):对expr使用print格式说明.

sub(r,s,t):在字符串t中用s替换正则表达式r的首次匹配.成功返回1,否则返回0.若没给出t,默认为$0.

gsub(r,s,t):在字符串t中,用s替换正则表达式r匹配的所有字符串,并返回替换个数.如果没有给出t,默认为$0.

substr(s,p,n):返回字符串s中从位置p开始长度为n的字串,如果没给出n或n长度大于从p到字符串结尾的长度,则返回从p开始到结尾的字符串.

tolower(s):将字符串s所有大写字符转换为小写,并返回新串.

toupper(s):将字符串s所有小写字符转换为大写,并返回新串.

 

 

子串:

index()和substr()都用于处理子串.

index(s,t)字符串开始位置是1(和c语言不同,c语言中子串开始位置是0).如果没有发现子串,函数返回0.

$ echo abcdefg | awk '{print index("asdg","dg")}'

3

$ echo abcdefg | awk '{print index("asdg","e")}' 

0

substr(s,p)返回字符串s中从p开始的所有字符.

$  echo abcdefg | awk '{print substr($1,3)}'       

cdefg

 

 

替换函数

sub()和gsub()的区别是:sub()只替换实现的第一个位置.gsub()是全部替换.(和sed中用g标志的替换命令相同).

替换后返回值是替换的数量,而不是替换后的字符串.所以,对于sub()来说,返回值只有0和1,可用其测试是否执行了替换操作.

如果想替换多个,如2个,3个....可用循环,下例中只有两个a,第三次没有了,就只能返回0.

 

$ echo aabbcc | awk '{print sub("a","A",$0);print sub("a","A",$0);print sub("a","A",$0)}'   

1

1

0

 

#awk中的print后面没有表达式则打印出全部,下例是替换后打印全部输入数据

$ echo aabbcc | awk '{gsub("a","A",$0);print}'                      

AAbbcc

 

 

大小写转换

toupper()和tolower().非字母的字符不会发生转换.

 

$ cat name_list 

Tim Duncan      21

Jason Kidd      5

Kevin Garnett   21

 

$ cat name_list | awk '{print "<" toupper($0) ">","<" tolower($0) ">"}'

<TIM DUNCAN     21> <tim duncan 21>

<JASON KIDD     5> <jason kidd  5>

<KEVIN GARNETT  21> <kevin garnett      21>

 

$ cat name_list | awk '{printf("<%s>,<%s>\n",toupper($0),tolower($0))}'

<TIM DUNCAN     21>,<tim duncan 21>

<JASON KIDD     5>,<jason kidd  5>

<KEVIN GARNETT  21>,<kevin garnett      21>

 

 

match(s,r)函数

match(字符串,正则表达式)函数用于确定一个正则表达式是否与字符串匹配.

参数与替换函数的参数顺序容易混淆.替换函数第一个参数是正则,第二个是字符串.match第一个是字符串,第二个是正则.

match()函数也设置了两个系统变量RSTART,RLENGTH.

RSTART包含这个函数的返回值,即匹配字串的开始位置.RLENGTH中包含匹配的字符串的子字符(而不是字串的结束位置).

 

 

自定义函数

 

function name(parameter-list){

statements

[return expression]

}

 

parameter-list是以逗号分隔的多个参数,不需要制定类型

return expression可选,通常返回一个值用于调用

function spurs(NUM){

        for(i=0;i<NUM;i++)

        print "GO SPURS"

        return "WIN"

}

suprs(3) #调用函数spurs(),3为参数

 

 

维护函数库

可以将不同脚本文件分类放置,这样保存函数文件可以方便重用.

 

0
0
分享到:
评论

相关推荐

    sed and awk 101 hacks.pdf

    - **使用printf格式化输出、awk内置数值函数、随机数生成器、常用字符串函数、GAWK/NAWK的字符串函数、处理参数、OFMT、GAWK内置的环境变量、pgawk–awk运行分析器、位操作、用户自定义函数、使输出摆脱语言依赖、...

    Vim-101-hacks、Sed-and-Awk-101-Hacks、Linux-101-hacks 英文版(高清)PDF

    "Sed-and-Awk-101-Hacks"可能涵盖awk的基础知识,如字段分隔符、模式匹配、条件判断、循环和函数。通过awk,你可以方便地处理CSV文件,进行数据分析,甚至实现简单的脚本任务。 4. Linux-101-hacks:Linux操作系统...

    Sed与Awk (中文版)

    本书是sed与awk的第二版,由O'Reilly & Associates出版,并授权给机械工业出版社在中国发行。书中提及的ISBN7-111-11527-9为本书的标识。第一版由Dougherty和Robbins著,张旭东等人翻译,机械工业出版社出版于2003年...

    sed-awk-2nd-edition.chm

    The book begins with an overview and a tutorial that demonstrate a progression in functionality from grep to sed to awk. sed and awk share a similar command-line syntax, accepting user instructions in...

    Sed与awk_中英文高清版

    《Sed与Awk》是IT领域中关于文本处理的经典之作,主要讲解了两种强大的命令行工具:Sed(流编辑器)和Awk(数据处理语言)。这两款工具在Linux和Unix系统中广泛使用,尤其适用于数据提取、转换、报告生成等任务。 ...

    sed & awk Pocket Reference-2nd-2002.chm

    English 2nd Edition 2002 chm format Summary of sed & awk

    SED与AWK 高清第三版

    《SED与AWK 高清第三版》是一本专注于Linux系统中强大文本处理工具sed和awk的教程。在Linux环境中,sed和awk是不可或缺的工具,它们能够高效地处理大量文本数据,进行搜索、替换、格式化等操作,极大地提高了运维...

    sed与awk(第二版)学习笔记

    sed与awk(第二版)学习笔记

    Sed与awk第二版(中文高清版)

    Sed与awk(第二版)这本书作为国外的经典教材,经过翻译后,为中文读者学习这些工具提供了极大的便利。它不仅系统地介绍了sed和awk的使用方法,还通过实例演示了如何编写有效的脚本来处理文本数据。对于那些希望提高...

    sed and awk 101 hacks

    第六章深入讲解了sed中的保持空间(HoldSpace)与模式空间(PatternSpace)的命令,这些命令允许sed在处理文本时存储和操作更多的数据: - 交换保持空间和模式空间(SwapPatternSpacewithHoldSpace,xcommand)。 - ...

    Sed与awk第二版(高清版).pdf

    根据提供的文件信息,我们可以从《Sed与awk第二版(高清版).pdf》这一资源中提炼出关于Sed和awk这两个强大的文本处理工具的相关知识点。虽然免责声明部分并未提供具体的技术内容,但我们可以通过书籍的标题、描述及...

    sed和awk的必备书籍

    包括: 1. sed与awk+第三版(中文高清晰),内容非常全面详细,看了觉得很不错,学习sed和awk的必备书籍。 2. Effective awk Programming, 4th Edition 3. Sed与awk第二版(高清版).pdf

    Sed与awk第二版(高清版)

    《Sed与Awk第二版》是一本深入探讨文本处理工具Sed和Awk的经典教程。这本书以高清的形式呈现,旨在帮助读者更好地理解和掌握这两种强大的命令行工具。Sed(Stream Editor)和Awk(Aho-Wedderburn-Kernighan)在Linux...

    sed与awk(第二版) - PDF(带目录)

    本书在一开始就给出一个概述和指南,论述了从grep到sed再到awk不断改进的功能。sed和awk具有相同的命令行语法,以脚本的形式接收用户的命令。因为所有这三个程序都使用UNIX正则表达式,因此书中用一章的篇幅来介绍...

    Sed与awk第三版(高清版)

    《Sed与Awk第三版》是一本针对Linux和Unix系统中两个强大的文本处理工具——sed和awk的详细教程。这两个工具在系统管理和自动化任务中起着至关重要的作用,尤其对于那些需要处理大量文本数据的场景。以下是关于sed和...

Global site tag (gtag.js) - Google Analytics