• awk使用说明


    原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html

    Awk使用说明

     

    运维必须掌握的三剑客工具:grep(文件内容过滤器)sed(数据流处理器)awk(报表生成器),该文档大致讲述一下awk语法和日常运维工作中使用awk带来的好处和效率再感叹一下awk实在是太强大了,完全是一门编程语言!(网上awk资料很多,自己整理Mark一下)

     

    提示:Linux使用的gawk

    官方解释:gawk - pattern scanning and processing language

    [root@test ~]# ll /bin/awk

    lrwxrwxrwx. 1 root root 4 Mar 16  2016 /bin/awk -> gawk

     

    语法格式

      awk [ POSIX or GNU style options ] 'program-file/script' file ...

      awk [ POSIX or GNU style options ] 'program-text/PATTERN {action}' file ...

     

    下面一一讲解各个参数的含义和用法

     

    一:Options

    参数选项,个人理解为打印报表输出指定哪种属性,一般用的最多的就是-F-v两个参数

    -F/--field-separatorUse fs for the input field separator.(分隔符文本切割字符串)

    该参数支持各种表达式,包括正则表达式 如:-F "^m"

    举例:ifconfig eth0 | awk -F "addr:| Bcast:" 'NR==2{print $2}'

    -v:Assign the value val to the variable var, before execution of the program begins.

      Action内部可以引用脚本外的变量

    举例:awk -v var="verrion" 'BEGIN{print var}'

     

    二:行为模式

    'program-text/PATTERN {action}':必须用单引号引用,中间的模式和action完全是一门编程语言,语法和其他编程或脚本语言类型,具有变量、逻辑语句等。

     

    1PATTERN模式

    'program-text/pattern {action}'

    模式类型

    解释说明

    举例

    empty

    空模式:匹配任意输入行

    awk -F: '{print $1}' /etc/passwd

    RE

    正在表达式:格式为/regular expression/

    awk -F: '/^m/{print $1}' /etc/passwd

    BEGIN/END

    仅在awk命令执行时运行一次或者结束前运行一次

    awk -F: 'BEGIN{un="Username";id="Id";shell="Shell";printf "%-10s%-10s%-20s ",un,id,shell}{printf "%-10s%-10s%-20s ",$1,$3,$7'} /etc/passwd

    Expression

    表达式:其值非0或非空字符时满足条件

    awk -F: '$1=="verrion"{print $1}' /etc/passwd

    Ranges

    指定范围匹配:格式为pat1,pat2

    awk -F: '/^r/,/^m/{print $1}' /etc/passwd

     

    2常见的action

    分类

    解释说明

    action类型

    Action支持各种类型,如下:

    expression表达式

    regular expression正则表达式

    Pattern expression模式匹配表达式

    control statements控制语句

    compound statements复合语句

    Input statements输入语句

    Output statements输出语句

    下面语法会一一讲解

    模式

    指定一个行的范围,该语法不能包括BEGIN/END模式

    BEGIN

    让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量

    END

    让用户在最后一条输入记录被读取之后所发生的动作

     

    3、语法如下

    1变量

    要点

    类型

    说明

    内置变量

    记录变量

    FS:field separator,读取文本时所使用的列分隔符

    RS:Record separator,输入文本信息所使用的行分隔符

    OFS:Output field separator

    ORS:Output record separator

    如:awk -F  OFS="#"   FS="#"

    数值变量

    NR:The number of input records;awk命令所处理的记录数,如果有多个文件,这个数目会把处理的多个文件中读取的行统一计数;

    NF:number of field;当前记录的field()个数;

    FNR:NR不同的是,FNR用于记录的行数是当前文件的总读取的行数;

    ARGV:数组,保存命令行整个字符串,如awk '{print $0} test1.txt test2.txt'这个命令中,ARGV[0]保存awkARGV[1]保存test1.txt

    ARGC:awk命令参数的个数;

    FILENAME:awk处理的文件名;

    外来变量

    自定义变量

    用户自定义自己的变量以便在程序或者脚本中使用,变量名命令规则和其他程序语言相同,只能以字母

    数字和下划线开头,gawk变量名称区分字符大小写

    在脚本中赋值变量

    给变量赋值使用赋值语句进行,比如:

    awk 'BEGIN{var="verrion";print var}'

    在命令行中赋值变量

    在脚本外为变量赋值,并在脚本中进行引用,比如:

    awk -v var="verrion" 'BEGIN{print var}'

     

    2数组

    要点

    说明

    解释

    表达式

    array[index-expression]

    可使用任意字符串,需要注意的是:如果某数组元素不存在,则自动创建此元素并初始化为空串;

    下标值

    不同之处

    重点:不同于其他语言的数组,其下表值不止于数字,可以是字符串,同时每个下标值可以做累积

    遍历元素

    For循环

    for(var in array){statement,...}

    其中var用于引用数组的下标,而不是元素

    判断元素

    index in array

    要判断某数组中是否存在某元素,需要使用index in array方式

    删除数组

    delete array[index]

    从关系数组中删除数组索引需要用delete命令

    典型案例

    语法for(i in array){statement1;statement2;....}

    1.awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){print "%15s;%i ",A,BASH[A]}}' /etc/passwd

    2.netstat -ant | awk '/^tcp/{++S[$NF]} END{for(a in S) print a,S[a]}'

     

    3操作符

    类型

    要点

    说明

    算法

    数值运算

    -x:负值   +x:转换为数值   x^y或x**y:次方

    x*y:乘法  x/y:除法  x+y:加法  x-y:减法 x%y:求余

    字符串

    字符串连接

    只有一个,而且不用写出来,用于字符串连接

    比如:awk 'BEGIN{a="a";b="b";c=(a""b);print c}'

    赋值

    类似于算法操作

    =:变量赋值 +=  -=  *=  /=  %=  ^=  **=

    ++:自增

    --:自减

    需要注意的是:如果某模式为*号,此时使用/*/可能会有语法错误,应以/[*]/替代;

    布尔值

    True/false

    任何非0值或非空字符串都为真,反之就为假;

    比较

    数值比较
    字符串匹配

    x<y  x<=y  x>y  x>=y  x==y  x!=y

    x~y y是个模式,x能被匹配到

    x!~y 不匹配模式

    逻辑关系

    并且或者

    &&:前一个条件满足才执行后一个条件

    ||:前一个条件不满足才执行后一个条件

    条件表达式

    复合表达式

    selector?if-true-exp:if-false-exp
    selector为真,执行if-true-exp,否则执行if-false-exp

    函数调用

    函数调用

    function_name(argv1,argv2)

     

    4控制语句

    表达式

    语法

    举例

    if-else

    if(condtion){then-body}else{[eles-body]}

    awk -F: '{if ($1=="root") print $1,"Admin";else print $1,"Common User"}' /etc/passwd

     

    while

    while(condtion){statement;....}

    awk -F: '{i=1;while(i<=3){print $i,i++}}' /etc/passwd

     

    do-while

    do{statement;....}while(condtion)

    awk -F: '{i=1;do {print $i,i++}while(i<=3)}' /etc/passwd

     

    for

    for(variable assignment;condtion;iteration process){statement;....}

    awk -F: '{for(i=1;i<=3;i++)print $i}' /etc/passwd

     

    case

    switch(expression){case VALUE or /REGEXP/;statement1,statement2,...,default;statementN,...}

    BEGIN {foo = 1;switch (foo) {case 3:print "x";break;case 2:print "y" ;break;case 1:print "z" ;break;default:print "default" ;}}

    breakcontinue

    常用于循环和case语句

    awk -F: '{for(i=1;i<=3;i++)if($i==root)break;print $i}' /etc/passwd

    next

    提前结束对本行文字的处理,并接着处理下一行

    awk -F: '{if($3%2==0)next;print $1,$3}' /etc/passwd

     

     

    5)打印输出

    打印类型

    使用方法

    注意事项

    print

    prinf使用格式print item,....

    1:各item之间使用逗号分开,而输出以空白输出;

    2:输出的item可以为字符串或数值,如记录的字段($1),变量或awk的表达式,数值会先转换为字符串,然后再输出;

    3print后面的item可以省略,则如print $0,因此,如果想输出空白行,则需要使用print ""

    printf

    printf使用格式:

    printf format, item....

    1:与print最大不同在于printf需要指定format

    2format用于指定后面的每个item输出格式;

    3printf不会自动打印换行符:

    format格式的指示符都以%开头,如下:

    %c:显示字符的ASCII码;

    %d,%i:十进制整数;

    %f:显示浮点数;

    %s:显示字符串;

    %u:无符号整数;

    %%:显示%本身;

    修饰符:

    N:显示宽度;

    -:左对齐;

    +:显示数字符号;

    如:%-10s 表示左对齐输出长度10个的字符串

     

    6函数

    类型

    常用函数

    举例

    内置函数

    数值函数rand():返回0-1之间的一个随机数

    awk 'BEGIN{print rand()}'

     

    length([s]):返回指定字符串的长度

    awk -F: '{print length($1)}' /etc/passwd

    sub(r,s,[t]):r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容

     

      awk -F: '{print sub(o,O,$1)}' /etc/passwd

     

    gsub(r,s,[t]):r表示的模式来查找t所表示的字符中的匹配的内容,并将其所有出现替换为s所表示的内容

    ls -l /etc/hosts | awk -F "" '{gsub("r","4")};{gsub("w","2")};{gsub("x","1")};{gsub("-","0");print $2+$3+$4 $5+$6+$7 $8+$9+$10}'

    split(s,a[,r]):r为分隔符分割字符s,并将分割后的结果保存至a数组中,数组以下标为1开始的序列

    netstat -ant | awk '/^tcp/{split($5,ip,":");count[ip[1]]++} END{for(i in count){print i,count[i]}}'

    自定义函数

    可以在引号中的任意地方定义,用{}表示块整体,可以定义参数,但调用时可带可不带

    用法如下:

    awk '

      function max(a,b,c)

      {

      return a>b?a:b

      }

      {print max($1,$2)}' file

    说明:显示每行前两个域的较大值,max为函数名,ab为参数

  • 相关阅读:
    Error Creating Deployment 有关Tomcat配置问题
    XML约束
    动态代理的一些问题。
    内部类的原理理解
    子父类覆盖方法和实现接口时牵扯到的细节问题。
    JavaSE 复习_4 接口多态和内部类
    JavaSE复习_3 继承
    JavaSE复习_2 对象与类
    JavaSE复习_1 Java的基本格式和运算符
    Linux 添加用户(user),组(Group)以及权限(Permission)
  • 原文地址:https://www.cnblogs.com/verrion/p/awk_usage.html
Copyright © 2020-2023  润新知