• shell编程之awk


    awk是一种用于处理数据和生成报告的编程语言

    awk可以在命令行中进行一些简单的操作,也可以被写成脚本来处理较大的应用问题

    awk与grep、sed结合使用,将使shell编程更加容易

    awk工作模式:

    awk逐行扫描输入(可以是文件与管道),按给定的模式查找出匹配的行,然后对这些执行awk命令指定的操作

    与sed一样,awk不会修改输入文件的内容。awk多了一个对列的处理,如果要处理列,awk是一个好的选择。可以使用重定向将awk的输出保存到文件中。

    一、awk简单用法

    awk   [options]  awk_cmd   files

    选项 :-F    指定输入记录字段的分隔符,默认使用环境变量IFS的值。

        -f      从指定文件读取awk_script

          -v      为awk设定变量

    例如:

    $1表示第一列。$0表示整行。

    awk   -F:  '{print  $1}'   /etc/passwd  :以冒号为分隔符,输出/etc/passwd中每行第一列内容

    awk   -F:  '{print  $1,$3}'   /etc/passwd  :以冒号为分隔符,输出/etc/passwd中每行第一列与第三列(默认空格分割)

    awk   -F:  '{print  $1 "|" $3}'   /etc/passwd  :输出/etc/passwd中每行第一列与第三列,且两列之间用|分隔

    awk   -F:  '/^root/{print  $1 "|" $3}'   /etc/passwd  :行首匹配root的行,输出这些行第一列与第三列,且两列之间用|分隔

    二、awk脚本用法:

    -f      从指定文件读取awk_script。

    其中awk_script语法:

    awk  'BEGIN  {actions}

        /pattern1/{actions}             命令1

          ......

        /patternN/{actions}             命令N

        END   {actions}'       input_file

    BEGIN{actions}与END{actions}可选,awk_script可以由一条或多条awk_cmd组成,每天awk_cmd各占一行。

    每个awk_cmd由两部分组成:/pattern/{actions}。其中/pattern/和{actions}可以省略,但不能同时省略;/pattern/省略时表示对所有的输入行执行指定的actions;

    {actions}省略时,表示打印符合pattern的所有整行。

    awk脚本的执行过程:

    1、如果存在BEGIN,awk首先会执行它指定的actions

    2、awk从输入中读取一行,称为一条输入记录

    3、awk将读入的记录分割成数个字段,并将第一个放入变量$1中,第二个放入$2中,依此类推。$0表示整条记录;字段分割符可以通过选项-F指定,否则使用缺省的分隔符

    4、把当前输入记录依次与每一个awk_cmd中的pattern比较:如果相匹配,就执行对应的actions

    如果不匹配,就跳过对应的actions,直到完成所有的awk_cmd

    5、当一条输入记录处理完毕,awk读取输入的下一行,重复上面的处理过程,直到所有输入全部处理完毕。

    6、awk处理完所有的输入后,若存在END,执行相应的actions。

    7、如果输入是文件列表,awk将按顺序处理列表中的每个文件。

    下面举个例子:

    ifconfig  |  awk  '/inet addr/{print $2}'  |  awk -F: '{print  $2}' :查找ip地址

    三、awk模式匹配:

    1、使用正则表达式

    ^:只匹配行首(可以看成是行首标志)

    $:只匹配行尾(可以看成是行尾标志)

    *:一个单字符后紧跟*号,可匹配0个或多个此字符

    [ ]:匹配[ ]内任意一个字符([^ ]反向匹配)

    :用来屏蔽一个元字符的特殊含义

    .:匹配任意单个字符

    str1|str2:匹配str1或str2

    +:匹配一个或多个前一个字符

    ?:匹配零个或一个前一个字符

    ( ):字符组

    2、使用布尔表达式,表达式的值为真时执行相应的操作

    表达式中可以使用变量(如字段变量$1,$2等)和/rexp/

    表达式中的运算符有

      关系运算符: <   >    <=    >=    ==     !=

      匹配运算符   ~     !~

        x  ~  /rexp/    如果 x匹配/rexp/ ,则返回真

      例如:awk     '$1 > 20  {print  $0}'   test.in

          awk    '$2  ~  /^6/  {print  $0}'   test.in

    3、复合表达式:&&、||、! 表达式中有比较运算符,一般用圆括号。

    例如:

    awk   '($1<20)&&($2 ~ /^6/){print $0}'  test.in

    awk   '($1<20)||($2 ~ /^6/){print $0}'   test.in

    awk    '!($2 ~ /^6/){print $0}' test.in

    awk     '/^#/ && /#$/ {print }'    test.in   :打印以#号开头,并且以#号结尾的行

    四、字段分隔符、重定向和管道

    字段分隔符:

    awk中的字段分隔符可以用 -F选项指定,缺省是空格(实际由全局变量IFS决定)

      例如:awk   '{print $1}'  test.in

         awk   -F:   '{print $1}'  test.in

         awk   -F  '[ :]'   '{print $1}'  test.in    :可以是空格、也可以是冒号来分隔

    五、重定向与管道:

      例如: awk   '{print  $1, $2 >  "output" }'  test.in     :第一列、第二列重定向到output文件

          awk   'BEGIN { "cal"  |  getline a; print a}'   : cal命令将日历显示出来,双引号不能省。获取cal输出的第一行到变量a中,打印输出

  • 相关阅读:
    中国历史朝代公元对照简表
    [Solved] DashBoard – Excel Service: The data sources may be unreachable, may not be responding, or may have denied you access.
    Delete/Remove Project from TFS 2010
    Sharepoint site showing system account instead of my username on the top right corner.
    你的成功在于你每天养成的习惯
    Internet Information Services is running in 32bit emulation mode. Correct the issue listed above and rerun setup.
    Prepare to back up and restore a farm (Office SharePoint Server 2007)
    Word中字号与磅值的对应关系
    How to: Change the Frequency for Refreshing the Data Warehouse for Team System
    UI Automation in WPF/Silverlight
  • 原文地址:https://www.cnblogs.com/wsw-seu/p/10822448.html
Copyright © 2020-2023  润新知