• awk(流程控制、内置变量、内置函数、数组)


    1、awk条件判断语句(if)
    if格式:
    if(表达式)
    {语句1}
    else if(表达式)
    {语句2}
    else
    {语句3}
    #awk 'BEGIN{
    > test=100; 
    > if(test>90){print "very good"}   
    > else if(test>60){print "good"}
    > else{print "no pass"}    
    > }'
    very good
    2、awk循环语句(while,for,do)
    while格式:
    while(表达式)
    {语句}
    #awk 'BEGIN{
    > test=100;
    > total=0;
    > while(i<=test) 
    > {           
    >  total+=i;
    >  i++;
    > }
    > print total;
    > }'
    5050
    for格式1:
    for(变量 in 数组)
    {语句}
    #awk 'BEGIN{
    > for(k in ENVIRON)
    > {
    >  print k"="ENVIRON[k];
    > }
    > }'
    TERM=linux
    G_BROKEN_FILENAMES=1
    SHLVL=1
    EDITOR=vim
    PWD=/root
    TMOUT=6000
    HISTTIMEFORMAT=%F %T -- 
    ...........
    for格式2:
    for(变量;条件;表达式)
    {语句}
    #awk 'BEGIN{
    total=0;
    for(i=0;i<=100;i++)
    {
    total+=i;
    }
    print total;
    }'
    5050

    do循环
    格式:
    do
    {语句}while(条件)
    #awk 'BEGIN{
    > total=0;
    > i=0;
    > do
    > {
    >  total+=i;
    >  i++;
    > }
    > while(i<=100)
    > print total;
    > }'
    5050

    ********************************************************************************
    内置变量1:
    $0  当前记录(作为单个变量) 
    $1~$n   当前记录的第n个字段,字段间由FS分隔 
    FS 输入字段分隔符 默认是空格 
    NF  当前记录中的字段个数,就是有多少列 
    NR  已经读出的记录数,就是行号,从1开始 
    #awk '/^root/{print $0}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    #awk 'BEGIN{FS=":"}/^root/{print $1,$NF}' /etc/passwd
    root /bin/bash
    (NF表示多少列嘛,那么$NF就表示最后一列)
    #awk 'BEGIN{FS=":"}{print NR,$1,$NF}' /etc/passwd
    1 root /bin/bash
    2 lp /sbin/nologin
    3 sync /bin/sync
    4 shutdown /sbin/shutdown
    5 halt /sbin/halt
    6 operator /sbin/nologin
    7 gopher /sbin/nologin
    8 nobody /sbin/nologin
    ........
    可以看出NR排好了行,相当于vim进去后set number的效果。

    内置变量2:
    ORS 输出的记录分隔符,默认为换行符 
    OFS 输出字段分隔符 默认也是空格 
    ARGC  命令行参数个数 
    ARGV  命令行参数数组 
    #awk 'BEGIN{FS=":";ORS="**"}{print FNR,$1,$NF}' /etc/passwd
    1 root /bin/bash**2 lp /sbin/nologin**3 sync /bin/sync**4 shutdown /sbin/shutdown**5 halt /sbin/halt**6 operator /sbin/nologin**7 gopher /sbin/nologin**8 nobody /sbin/nologin
    可以看到原本换行符的形式通过ORS使得输出的换行符形式改成了**
    #awk 'BEGIN{FS=":";print "ARGC="ARGC;for(k in ARGV) {print k"="ARGV[k]; }}' /etc/passwd
    ARGC=2
    0=awk
    1=/etc/passwd
    ARGC得到所有输入参数个数,ARGV获得输入参数内容,是一个数组。
    感觉这个不太实用!

    ********************************************************************************
    awk内置函数:算数函数、字符串函数、其它一般函数

    一、算数函数
    cos( x ) 返回 x 的余弦;x 是弧度。 
    sin( x ) 返回 x 的正弦;x 是弧度。 
    int( x ) 返回 x 的截断至整数的值。 
    #awk 'BEGIN{a=int(8.998273485);print a}'
    8
    二、字符串函数
    sub( Ere, Repl, [ In ] )  
    gsub( Ere, Repl, [ In ] ) 
    index( String1, String2 ) 
    match( String, Ere )
    substr( String, M, [ N ] )
    split( String, A, [Ere] )
    length [(String)] 

    #awk 'BEGIN{info="this is a test123test456!";sub(/[0-9]+/,"!",info);print info}'
    this is a test!test456!
    用sub实现替换,注意sub括号内的格式
    [Intranet [email=root@inc-wzp24-oldxen-150-117]root@inc-wzp24-oldxen-150-117[/email] /etc/xen]
    #awk 'BEGIN{info="this is a test123test456!";gsub(/[0-9]+/,"!",info);print info}'
    this is a test!test!!
    用gsub实现全局替换

    #awk 'BEGIN{info="this is a test123test!!";print index(info,"test")?"test exist!":"no found test!"}'  
    test exist!
    #awk 'BEGIN{info="this is a test123test!!";print index(info,"321")?"321 exist!":"no found 321!"}'            
    no found 321!
    通过index查找字符串

    #awk 'BEGIN{info="this is a test123test!";print match(info,/[0-9]+/)?"num exist":"no found num!"}'     
    num exist
    #awk 'BEGIN{info="this is a testtest!";print match(info,/[0-9]+/)?"num exist":"no found num!"}'   
    no found num!
    通过match实现正则表达式匹配查找

    #awk 'BEGIN{info="1234567abc";print substr(info,4,6)}' 
    4567ab
    通过substr截取字符串,从第2个字符开始,截取6个长度的字符串
    #awk 'BEGIN{info="this is a test";split(info,a," ");for(i in a);print i,a}'      
    3 a
    #awk 'BEGIN{info="this is a test haha";split(info,ali," ");print length(ali);for(k in ali){print k,ali[k]}}'      
    5
    4 test
    5 haha
    1 this
    2 is
    3 a
    通过split实现字符串分割

    三、一般函数
    getline[ Variable ]
    system(Command)
    #awk 'BEGIN{print "input your name:";getline name;print name}'
    input your name:
    alibaba
    alibaba
    通过getline来获取用户输入数据,相当于shell的read命令

    #awk 'BEGIN{b=system("date;cal");print b}' 
    Wed Sep  7 15:53:48 CST 2011
       September 2011   
    Su Mo Tu We Th Fr Sa
                 1  2  3
    4  5  6  7  8  9 10
    11 12 13 14 15 16 17
    18 19 20 21 22 23 24
    25 26 27 28 29 30
    0
    system用户调用外部应用程序命令,还可以发现返回了运行状态码0

    ********************************************************************************
    一、定义数组方法
    1、可以用数值作为数组索引
    a[1]="hello world"
    b[2]="hello baby"
    2、可以用字符串作为数组索引
    a["first"]="alibaba"
    b["last"]="taobao"

    二、数组相关函数
    1、获取数组长度(length方法使用)
    #awk 'BEGIN{info="this is a test";len=split(info,a," ");print length(a),length(info),len}' 
    4 14 4
    2、输出数组内容(无序,有序输出):

    #awk 'BEGIN{info="this is a test";split(info,a," ");for(i in a){print i,a}}'  
    4 test
    1 this
    2 is
    3 a
    #awk 'BEGIN{info="this is a test";len=split(info,a," ");for(i=1;i<=len;i++){print i,a}}'
    1 this
    2 is
    3 a
    4 test
    #awk 'BEGIN{a[1]="b";c["d"]="f";if(a[1]="b"){print "good"};if(c["d"]!=g){print "good again"}}'
    good
    good again
    3、数组排序实现方法
    #awk 'BEGIN{
    > a[100]=100;
    > a[2]=224;
    > a[3]=45;
    > slen=asort(a,b)
    > for(i=1;i<=slen;i++)
    > {print i,b}
    > }'
    1 45
    2 100
    3 224
    asort对数组的值进行排序,而原先键值丢掉。
    #awk 'BEGIN{
    > a["f"]=100;
    > a["a"]=893;
    > a["b"]=90;
    > slen=asorti(a,b);
    > for(i=1;i<=slen;i++)
    > {print i,b,a[b]}
    > }'
    1 a 893
    2 b 90
    3 f 100
    asorti对键值进行排序(字符串类型),将生成新的数组放入b中。
  • 相关阅读:
    Python 单向循环链表
    python 单向链表实现
    Python实现栈
    单进程-非阻塞服务器
    Nginx开发从入门到精通
    Spring入门第十五课
    Spring入门第十六课
    Spring入门第十四课
    Spring入门第十三课
    Spring入门第十二课
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/5683023.html
Copyright © 2020-2023  润新知