`
tolys
  • 浏览: 118212 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论
阅读更多

1. awk简介

awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出 (屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。下面介绍的awk是以GUN的gawk为例的,在 linux系统中已把awk链接到gawk,所以下面全部以awk进行介绍。

-F fs or --field-separator fs

指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。

-v var=value or --asign var=value

赋值一个用户定义变量。

-f scripfile or --file scriptfile

从脚本文件中读取awk命令。

-mf nnn and -mr nnn

对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

-W compact or --compat, -W traditional or --traditional

在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。

-W copyleft or --copyleft, -W copyright or --copyright

打印简短的版权信息。

-W help or --help, -W usage or --usage

打印全部awk选项和每个选项的简短说明。

-W lint or --lint

打印不能向传统unix平台移植的结构的警告。

-W lint-old or --lint-old

打印关于不能向传统unix平台移植的结构的警告。

-W posix

打开兼容模式。但有以下限制,不识别:\x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。

-W re-interval or --re-inerval

允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。

-W source program-text or --source program-text

使用program-text作为源代码,可与-f命令混用。

-W version or --version

打印bug报告信息的版本。

一般通用的元字符集就不讲了,可参考我的SedGrep学习笔记。以下几个是gawk专用的,不适合unix版本的awk。

\Y

匹配一个单词开头或者末尾的空字符串。

\B

匹配单词内的空字符串。

\<

匹配一个单词的开头的空字符串,锚定开始。

\>

匹配一个单词的末尾的空字符串,锚定末尾。

\w

匹配一个字母数字组成的单词。

\W

匹配一个非字母数字组成的单词。

\‘

匹配字符串开头的一个空字符串。

\'

匹配字符串末尾的一个空字符串。

  • awk 可使用shell的重定向符进行重定向输出,如:$ awk '$1 = 100 {print $1 > "output_file" }' test。上式表示如果第一个域的值等于100,则把它输出到output_file中。也可以用>>来重定向输出,但不清空文件,只做追加操作。

  • 输出重定向需用到getline函数。getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就返回0,如果出现错误,例如打开文件失败,就返回-1。如:

    $ awk 'BEGIN{ "date" | getline d; print d}' test。执行linux的date命令,并通过管道输出给getline,然后再把输出赋值给自定义变量d,并打印它。

    $ awk 'BEGIN{"date" | getline d; split(d,mon); print mon[2]}' test。执行shell的date命令,并通过管道输出给getline,然后getline从管道中读取并将输入赋值给d,split函数把变量d转化成数组mon,然后打印数组mon的第二个元素。

    $ awk 'BEGIN{while( "ls" | getline) print}',命令ls的输出传递给geline作为输入,循环使getline从ls的输出中读取一行,并把它打印到屏幕。这里没有输入文件,因为 BEGIN块在打开输入文件前执行,所以可以忽略输入文件。

    $ awk 'BEGIN{printf "What is your name?"; getline name < "/dev/tty" } $1 ~name {print "Found" name on line ", NR "."} END{print "See you," name "."} test。在屏幕上打印”What is your name?",并等待用户应答。当一行输入完毕后,getline函数从终端接收该行输入,并把它储存在自定义变量name中。如果第一个域匹配变量 name的值,print函数就被执行,END块打印See you和name的值。

    $ awk 'BEGIN{while (getline < "/etc/passwd" > 0) lc++; print lc}'。awk将逐行读取文件/etc/passwd的内容,在到达文件末尾前,计数器lc一直增加,当到末尾时,打印lc的值。注意,如果文件不存在,getline返回-1,如果到达文件的末尾就返回0,如果读到一行,就返回1,所以命令 while (getline < "/etc/passwd")在文件不存在的情况下将陷入无限循环,因为返回-1表示逻辑真。

  • 可以在awk中打开一个管道,且同一时刻只能有一个管道存在。通过close()可关闭管道。如:$ awk '{print $1, $2 | "sort" }' test END {close("sort")}。awd把print语句的输出通过管道作为linux命令sort的输入,END块执行关闭管道操作。

  • system函数可以在awk中执行linux的命令。如:$ awk 'BEGIN{system("clear")'。

  • fflush函数用以刷新输出缓冲区,如果没有参数,就刷新标准输出的缓冲区,如果以空字符串为参数,如fflush(""),则刷新所有文件和管道的输出缓冲区。

  • sub函数匹配记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的时候。格式如下:

                sub (regular expression, substitution string):
    sub (regular expression, substitution string, target string)

    实例:

                $ awk '{ sub(/test/, "mytest"); print }' testfile
    $ awk '{ sub(/test/, "mytest"); $1}; print }' testfile

    第一个例子在整个记录中匹配,替换只发生在第一次匹配发生的时候。如要在整个文件中进行匹配需要用到gsub

    第二个例子在整个记录的第一个域中进行匹配,替换只发生在第一次匹配发生的时候。

  • gsub函数作用如sub,但它在整个文档中进行匹配。格式如下:

                gsub (regular expression, substitution string)
    gsub (regular expression, substitution string, target string)

    实例:

                $ awk '{ gsub(/test/, "mytest"); print }' testfile
    $ awk '{ gsub(/test/, "mytest"), $1 }; print }' testfile

    第一个例子在整个文档中匹配test,匹配的都被替换成mytest。

    第二个例子在整个文档的第一个域中匹配,所有匹配的都被替换成mytest。

  • index函数返回子字符串第一次被匹配的位置,偏移量从位置1开始。格式如下:

              index(string, substring)

    实例:

                $ awk '{ print index("test", "mytest") }' testfile

    实例返回test在mytest的位置,结果应该是3。

  • length函数返回记录的字符数。格式如下:

                length( string )
    length

    实例:

                $ awk '{ print length( "test" ) }' 
    $ awk '{ print length }' testfile

    第一个实例返回test字符串的长度。

    第二个实例返回testfile文件中第条记录的字符数。

  • substr函数返回从位置1开始的子字符串,如果指定长度超过实际长度,就返回整个字符串。格式如下:

                substr( string, starting position )
    substr( string, starting position, length of string )

    实例:

                $ awk '{ print substr( "hello world", 7,11 ) }' 

    上例截取了world子字符串。

  • match函数返回在字符串中正则表达式位置的索引,如果找不到指定的正则表达式则返回0。match函数会设置内建变量RSTART为字符串中子字符串的开始位置,RLENGTH为到子字符串末尾的字符个数。substr可利于这些变量来截取字符串。函数格式如下:

                match( string, regular expression )

    实例:

                $ awk '{start=match("this is a test",/[a-z]+$/); print start}'
    $ awk '{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'

    第一个实例打印以连续小写字符结尾的开始位置,这里是11。

    第二个实例还打印RSTART和RLENGTH变量,这里是11(start),11(RSTART),4(RLENGTH)。

  • toupper和tolower函数可用于字符串大小间的转换,该功能只在gawk中有效。格式如下:

                toupper( string )
    tolower( string )

    实例:

                $ awk '{ print toupper("test"), tolower("TEST") }'
  • split函数可按给定的分隔符把字符串分割为一个数组。如果分隔符没提供,则按当前FS值进行分割。格式如下:

                split( string, array, field separator )
    split( string, array )

    实例:

                $ awk '{ split( "20:18:00", time, ":" ); print time[2] }'

    上例把时间按冒号分割到time数组内,并显示第二个数组元素18。

 
评论

相关推荐

    grep、sed、awk、perl等对正则表达式的支持的差别

    在IT领域,文本处理是日常工作中不可或缺的一部分,而grep、sed、awk和perl这四个工具在处理文本时都广泛地使用了正则表达式。它们各自有着不同的特性和适用场景,理解它们之间的差异有助于我们更高效地进行文本操作...

    深入浅出正则表达式,正则表达式详细介绍

    3. **现代发展**:随着Unix系统的普及,正则表达式成为许多Unix工具的基础,如grep、sed和awk等。 4. **广泛使用**:20世纪90年代以来,随着Perl语言的流行,Perl风格的正则表达式成为业界标准,并被多种编程语言所...

    正则表达式.txt,正则表达式.txt

    此外,在日常工作中使用的工具如 grep、sed 和 awk 等也支持正则表达式的操作。 #### 三、基本概念介绍 1. **元字符**:正则表达式中的特殊字符,用于构建复杂的匹配规则。 - **`.`**:匹配任何单个字符(除了换...

    JAVA 正则表达式(超详细)

    1. 正则表达式的引擎:正则表达式的引擎已经被许多 Unix 工具实现,包括 grep、awk、vi 和 Emacs 等。许多脚本语言也支持正则表达式,例如 Python、Tcl、JavaScript 和 Perl。 2. Java 正则表达式的历史:Java 一直...

    linux系统shell正则表达式-练习工具和教材

    在Linux Shell环境中,正则表达式常与grep、sed、awk等命令结合使用,以实现高效的数据筛选和处理。 1. 元字符:正则表达式的核心是元字符,它们具有特殊的含义。例如,`.`表示任意单个字符,`^`表示行首,`$`表示...

    正则表达式详细介绍

    在Linux和Unix环境中,正则表达式常用于命令行工具,如grep、sed和awk等。在这些环境中,正则表达式广泛用于文本处理和自动化任务的脚本编写。 综上所述,正则表达式是文本处理中不可或缺的工具。通过理解正则...

    正则表达式百度版

    在Unix工具中,如sed(流编辑器)、awk(一种数据处理脚本语言)和grep(全局正则表达式打印),正则表达式被广泛使用来处理文本文件。egrep是grep的一种增强版本,提供了更丰富的正则表达式支持。此外,vi编辑器的...

    unix下的正则表达式

    2. **扩展正则表达式**(Extended Regular Expression, ERE):这是更现代的形式,由POSIX标准定义,提供了更多的元字符和功能,如egrep和awk支持的正则表达式。 #### 二、元字符及其功能 元字符是正则表达式的...

    正则表达式大全(超好)

    2. **awk**:awk是另一个强大的文本处理工具,它内置了正则表达式引擎,可以方便地处理文本数据。 3. **grep**:grep用于在文件中查找匹配特定模式的行,其支持正则表达式模式匹配。 4. **vi/vim**:vi编辑器中的...

    正则表达式之道 电子书 下载

    正则表达式不仅在文本编辑器(如vi)中用于查找和替换,还广泛应用于各种脚本工具(如awk、grep、sed)和编程语言(如Perl、Python、JavaScript等)。通过学习和实践,你可以快速高效地完成诸如数据提取、文本过滤和...

    正则表达式匹配(自动转换)

    正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和分析字符串模式。它由特殊字符和普通字符组成,可以构建出复杂且灵活的规则,以满足各种文本处理需求。"正则表达式匹配(自动转换)"指的是通过特定的...

    快速上手正则表达式

    正则表达式是一种文本处理工具,广泛应用于搜索、替换、识别符合特定模式的字符串。在文本处理和数据提取方面,正则表达式发挥着至关重要的作用。我们常说的RE就是正则表达式的简称。正则表达式由一些特殊字符和符号...

    zzbd.rar_正则表达式_正则表达式c++

    正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和分析字符串模式。在C++编程语言中,正则表达式库提供了对正则表达式的支持,使得开发者能够高效地处理复杂的文本数据。本教程将深入探讨正则表达式的...

    正则表达式及其巧妙运用

    ### 正则表达式及其巧妙运用 #### 一、什么是正则表达式 正则表达式是一种用于描述字符串模式的强大工具。它可以帮助用户快速地在大量文本数据中找到符合特定模式的数据片段。虽然初次接触正则表达式的人可能会...

    正则表达式-随心查找随心所用

    正则表达式是一种强大的文本处理工具,用于模式匹配和替换。它在各种编程语言和操作系统中广泛应用,如UNIX系统下的Vi编辑器、Perl、PHP、awk、sed,以及JavaScript等客户端脚本语言。正则表达式的核心在于构建匹配...

    正则表达式+词法分析

    在实际应用中,正则表达式和词法分析经常结合使用,例如在文本处理工具(如grep、sed、awk)中,用户可以通过正则表达式指定搜索或替换的模式,而这些工具内部则会进行词法分析以处理输入。此外,在编译器和解释器的...

    正则表达式之道.doc

    正则表达式在多种工具中都有应用,包括但不限于文本编辑器、脚本语言(如Perl、Python等)、命令行工具(如grep、sed、awk)等。 **1. vi 文本编辑器** - **文本替换**: 在vi编辑器中,使用`:%s/pattern/...

    正则表达式之道,讲述正则表达式。

    同时,不同的工具如vi、grep、sed、awk和Perl等都有自己的正则表达式实现,了解它们之间的差异和共性,可以让你在不同环境下灵活运用。 在实际应用中,正则表达式可以用于数据验证(如邮箱格式、电话号码格式等)、...

    正则表达式素材3

    - **文本处理**:在命令行工具如grep、sed、awk中,正则表达式用于快速查找、替换和提取文本。 - **编程语言支持**:许多编程语言内置了正则表达式库,如Python的`re`模块,JavaScript的`match`, `search`, `...

    python正则表达式例子

    根据提供的文件信息,我们可以深入探讨正则表达式在Python中的应用。正则表达式是一种强大的文本处理工具,能够帮助我们高效地完成字符串的查找、替换等操作。下面将结合具体的例子来详细介绍正则表达式的使用方法...

Global site tag (gtag.js) - Google Analytics