zoukankan      html  css  js  c++  java
  • 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中,打印输出

  • 相关阅读:
    网络协议(一)HTTP请求报文(请求行、请求头、请求体),响应报文
    Java集合(五) Set 添加元素
    Java 泛型面试题
    并发编程-线程池(二)线程池回收线程
    Java(二)equal 和 hashcode使用
    Java 泛型(一)作用和使用
    Java排序(一)实现类的排序
    Java排序(二)排序算法的稳定性
    SDL 程序编译错误-undefined reference to `SDL_GetError'
    SDL程序编译错误-error: conflicting types for ‘_XData32’
  • 原文地址:https://www.cnblogs.com/wsw-seu/p/10822448.html
Copyright © 2011-2022 走看看