Awk编程模型及元字符集

来源:互联网 发布:怎么选基金 知乎 编辑:程序博客网 时间:2024/05/19 20:47

                                                 Awk编程模型及元字符集


一、awk编程模型



       awk由第二阶段的主输入循环维持,主输入循环反复执行,直到终止条件被触发。主输入循环自动依次读取输入文件行,以供处理,而处理的动作由程序员添加。awk已经搭建好了主输入循环的框架,我们的代码直接被嵌入到主输入循环中执行。与C语言不同,这里不用写main函数框架,我们的代码直接就是main函数中的语句。

       awk的两个特殊字段:BEGIN,主输入循环之前(未读取输入文件行之前执行);END字段,反之。


二、awk调用方法

awk调用方法有三种:

  1. shell 命令行调用: awk [-F 域分割符] 'awk程序段'输入文件

  2. awk命令插入相应脚本文件,然后awk命令调用:

    awk -f awk脚本文件 输入文件 (-f表示调用awk脚本文件)

  3. awk命令插入相应脚本文件,设置脚本文件可执行,然后直接执行该脚本文件:

    ./awk脚本文件 输入文件

    awk 脚本文件以sha-bang(#!)符号开头,其后加上awk路径(如/usr/bin/awk)。

    在我的ubuntu系统中,ls-l /usr/bin > /home/ly/haha ,将输出结果定向到haha文件,可以看到

    lrwxrwxrwx 1 root root 21Oct 22 00:25 awk -> /etc/alternatives/awk

    (这是一个符号链接)

三、awk模式匹配


任何awk都由模式(pattern)和动作(action)组成。

模式:测试输入行是否需要执行动作的规则,决定动作何时触发。

动作:执行对输入行的处理

awk 的模式匹配经常用到正在表达式,下文先对正则表达式做简要介绍。


正则表达式的目的在于完成数据过滤,留下匹配的数据,去除不匹配的数据



            正则表达式是由一串字符和元字符构成的字符串,简称RERegularExpression)。

            正则表达式的基本元素包括普通字符和元字符:普通字符,没有隐含意义,字面理解;元字符,shell赋予了他们超越字面的意义。下面是基本正则表达式中元字符集合及其意义(POSIX标准将正则表达式分做基本正则表达式和扩展正则表达式,大部分应用使用基本正则表达式)。

                                                               基本正则表达式元字符集合及其意义


符合

意义

*

0个或多个在*字符之前的那个普通字符

.

匹配任意字符

^

匹配行首或后面字符的非

$

匹配行尾

[  ]

匹配字符集合

\

转义符,屏蔽一个元字符的特殊意义

\<\>

精确匹配符

\{n\}

匹配前面字符出现n

\{n,\}

匹配前面字符至少出现n

\{n,m\}

匹配前面字符出现n~m

正则表达式匹配举例:

  1. hel*o 可匹配字符 helo hello helllo

  2. hel.o 可匹配字符 helxo hel9o hel o ( . 可以匹配一个空格 )

  3. ^hello匹配以hello开头的行

  4. hello$ 匹配以hello结尾的行,$放在匹配符号之后,用法和功能与^相反。

  5. ^$又匹配行首,又匹配行尾,中间没有字符,表示空行

  6. ^.$匹配只有一个字符的空行

  7. [123456]匹配其中任一个数字。

  8. [1-6]匹配1-6其中任一个数字。

  9. [a-z]匹配a-z其中任一个字母。

  10. [^1-6]匹配不在1-6中的任一个数字。^放在[]中表示取反。

  11. [a-zA-Z]匹配所以英文单词

  12. \. .不在表示任意一个字符,而只是一个普通字符。

  13. \<the\> 精确匹配the这个单词,一点都不能差。

  14. JP\{3\}L 匹配值为JPPPL

  15. JP\{3\}L P至少出现3

  16. [a-z]\{5\} 精确匹配5个小写字母,如hello,house

扩展正则表达式元字符集合及其意义

   符号

意义

   

匹配0个或1个在其之前的那个普通字符

   +

匹配1个或多个在其之前的那个普通字符

  ()

表示一个字符集合或用在expr

    |

表示或,匹配一组可选的字符


扩展正则表达式匹配举例:

      1. jo?b 匹配jobjoob

      2. de+x 匹配deex deeeeeeex,但不匹配dex

      3. rea|e|od匹配readreed reod

      4. RE1|RE2|RE3 表示多个正则表达式的或关系

awk 支持?和+两个两个扩展元字符。


下面是一个shell命令行调用awk的例子


       awk '/^$/ {print “this is a blankline .”}' input

       一直输入回车,会打印this is a blank line^$匹配一个空行。

       awk 命令存在于单引号中间,由两部分组成,^$部分是模式,花括号部分是动作,/ 号分割,input是输入的文件名称。


本文完全参照           <linux shell 编程从初学到精通>    华清远见嵌入式培训中心  伍之昂等编著


0 0
原创粉丝点击