zoukankan      html  css  js  c++  java
  • 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为参数

  • 相关阅读:
    Head first javascript(七)
    Python Fundamental for Django
    Head first javascript(六)
    Head first javascript(五)
    Head first javascript(四)
    Head first javascript(三)
    Head first javascript(二)
    Head first javascript(一)
    Sicily 1090. Highways 解题报告
    Python GUI programming(tkinter)
  • 原文地址:https://www.cnblogs.com/verrion/p/awk_usage.html
Copyright © 2011-2022 走看看