设为首页 收藏本站
查看: 284|回复: 0

[经验分享] awk(gawk)模式扫描及处理语言

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2016-2-3 08:42:06 | 显示全部楼层 |阅读模式
awk(gawk)模式扫描及处理语言

基本用法:awk [options] 'program' FILE
    program:PAT{action statements}
    语句之间用分号隔开
        print,printf


1
2
3
4
5
6
7
8
    [iyunv@makeISO ~]# cat /etc/fstab |grep '^[^#]'|awk '{print $1,$2}'
    /dev/mapper/vg_makeiso-lv_root /
    UUID=e20786ee-7475-4afd-b28b-0585dcb3c1a7 /boot
    /dev/mapper/vg_makeiso-lv_swap swap
    tmpfs /dev/shm
    devpts /dev/pts
    sysfs /sys
    proc /proc




选项:
    -F:指明输入时用到的字段分隔符,默认分隔符为一个或多个连续的空格
    -v var=value:自定义变量

1、print
    print item1,item2
    要点:
        1、逗号分隔符
        2、输出的个item可以是字符串,也可以是数值;当前记录的字段、变量或者awk的表达式
        3、如省略item,则显示$0,即显示所有item


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{print }'
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{print $0}'
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{print $1 $2}'
    rootx
    binx
    daemonx
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{print $1 "\t" $2}'
    root    x
    bin    x
    daemon    x
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{print $1 , $2}'
    root x
    bin x
    daemon x
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{print $1 "---" $2}'
    root---x
    bin---x
    daemon---x




2、变量
    2.1 内建变量
        FS:输入的分隔符,默认为空白字符(-v FS=":")
        OFS:输出时的分隔符,默认为空白字符(-v OFS="-")
        RS:输入时的换行符
        ORS:输出时的换行符
        NF:每一行的字段数量 awk '{print NF}' file
        NR:文件中的行数
        FNR:每个文件分别计数NR
        FILENAME:文件名
        ARGC:命令行中参数的个数
        ARGV:数组,保存的是命令行中保存的各参数


1
2
3
4
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -v FS=: -v OFS=- '{print $1,$2}'
    root-x
    bin-x
    daemon-x



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    [iyunv@makeISO ~]# head -2 /etc/passwd |awk -v RS=: '{print $0}'
    root
    x
    0
    0
    root
    /root
    /bin/bash
    bin
    x
    1
    1
    bin
    /bin
    /sbin/nologin



1
2
3
4
5
6
7
8
9
10
    [iyunv@makeISO ~]# head -2 /etc/passwd |awk -v RS=: '{print $0}' |awk -v ORS=# '{print $0}'
    root#x#0#0#root#/root#/bin/bash#bin#x#1#1#bin#/bin#/sbin/nologin##[iyunv@makeISO ~]#
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{print NF}'
    7
    7
    7
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{print $NF}'
    /bin/bash
    /sbin/nologin
    /sbin/nologin



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    [iyunv@makeISO ~]# cat file1
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    [iyunv@makeISO ~]# cat file2
    pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin
    [iyunv@makeISO ~]# awk -F: '{print FILENAME,NR,$1}' file1 file2
    file1 1 root
    file1 2 bin
    file1 3 daemon
    file2 4 pulse
    file2 5 sshd
    file2 6 tcpdump
    [iyunv@makeISO ~]# awk -F: '{print FILENAME,FNR,$1}' file1 file2
    file1 1 root
    file1 2 bin
    file1 3 daemon
    file2 1 pulse
    file2 2 sshd
    file2 3 tcpdump



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
31
32
33
34
35
36
    [iyunv@makeISO ~]# awk -F: '{print ARGC}' file1 file2
    3
    3
    3
    3
    3
    3
    [iyunv@makeISO ~]# awk -F: '{print ARGV[0]}' file1 file2
    awk
    awk
    awk
    awk
    awk
    awk
    [iyunv@makeISO ~]# awk -F: '{print ARGV[1]}' file1 file2
    file1
    file1
    file1
    file1
    file1
    file1
    [iyunv@makeISO ~]# awk -F: '{print ARGV[2]}' file1 file2
    file2
    file2
    file2
    file2
    file2
    file2
    [iyunv@makeISO ~]# awk -F: 'BEGIN{print ARGC}' file1 file2
    3
    [iyunv@makeISO ~]# awk -F: 'BEGIN{print ARGV[0]}' file1 file2
    awk
    [iyunv@makeISO ~]# awk -F: 'BEGIN{print ARGV[1]}' file1 file2
    file1
    [iyunv@makeISO ~]# awk -F: 'BEGIN{print ARGV[2]}' file1 file2
    file2



    2.2 自定义变量
        (1)    -v var=value
            变量名区分大小写
        (2) 在program中直接定义
            awk '{var=value ; print var}' file

1
2
3
4
5
6
    [iyunv@makeISO ~]# awk -v test='this is a test !!!' '{print test}' file1
    this is a test !!!
    this is a test !!!
    this is a test !!!
    [iyunv@makeISO ~]# awk -v test='this is a test !!!' 'BEGIN{print test}' file1
    this is a test !!!



1
2
3
4
5
6
7
8
    [iyunv@makeISO ~]# awk '{test="this is a test \!\!\!"; print test }' file1
    awk: warning: escape sequence `\!' treated as plain `!'
    this is a test !!!
    this is a test !!!
    this is a test !!!
    [iyunv@makeISO ~]# awk 'BEGIN{test="this is a test \!\!\!"; print test }' file1
    awk: warning: escape sequence `\!' treated as plain `!'
    this is a test !!!



    3、printf命令--格式化输出
   
        printf FORMAT,item1,item2
        (1)    FORMAT必须给出
        (2)    不会自动换行,需要显示给出换行控制符,\n
        (3)    FORMAT中需要分别为后面的每个item指定一个格式化的符号
   
        格式符:
            %c      显示字符的ASCII码
            %d,%i     显示十进制整数
            %e,%E     科学计数法数值显示
            %f         显示为浮点数
            %g,%G     以科学计数法或浮点形式显示
            %s         显示字符串
            %u         显示无符号整数
            %%         显示%自身

        修饰符:
            %s -->> %#[.#]s
            %#[.#]s     第一个数字控制显示宽度,第二个数字表示小数点精度
            %-#[.#]s     在固定的宽度内显示内容左对齐,默认为右对齐
                注:当显示宽度小于内容宽度时,只会显示不整齐,不会漏显示内容
            %d -->> %+d
                负数默认显示-,正数强制显示+




1
2
3
4
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{printf "User"NR " is:%s\n",$1}'
    User1 is:root
    User2 is:bin
    User3 is:daemon



1
2
3
4
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{printf "username :%s \t UID : %d \n",$1,$3}'
    username :root      UID : 0
    username :bin      UID : 1
    username :daemon      UID : 2



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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{printf "username :%1s \t UID : %d \n",$1,$3}'
    username :root      UID : 0
    username :bin      UID : 1
    username :daemon      UID : 2
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{printf "username :%2s \t UID : %d \n",$1,$3}'
    username :root      UID : 0
    username :bin      UID : 1
    username :daemon      UID : 2
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{printf "username :%3s \t UID : %d \n",$1,$3}'
    username :root      UID : 0
    username :bin      UID : 1
    username :daemon      UID : 2
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{printf "username :%4s \t UID : %d \n",$1,$3}'
    username :root      UID : 0
    username : bin      UID : 1
    username :daemon      UID : 2
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{printf "username :%5s \t UID : %d \n",$1,$3}'
    username : root      UID : 0
    username :  bin      UID : 1
    username :daemon      UID : 2
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{printf "username :%6s \t UID : %d \n",$1,$3}'
    username :  root      UID : 0
    username :   bin      UID : 1
    username :daemon      UID : 2
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{printf "username :%7s \t UID : %d \n",$1,$3}'
    username :   root      UID : 0
    username :    bin      UID : 1
    username : daemon      UID : 2
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{printf "username :%8s \t UID : %d \n",$1,$3}'
    username :    root      UID : 0
    username :     bin      UID : 1
    username :  daemon      UID : 2
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{printf "username :%9s \t UID : %d \n",$1,$3}'
    username :     root      UID : 0
    username :      bin      UID : 1
    username :   daemon      UID : 2
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{printf "username :%-9s \t UID : %d \n",$1,$3}'
    username :root           UID : 0
    username :bin            UID : 1
    username :daemon         UID : 2
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{printf "username :%-1s \t UID : %d \n",$1,$3}'
    username :root      UID : 0
    username :bin      UID : 1
    username :daemon      UID : 2



1
2
3
4
    [iyunv@makeISO ~]# head -3 /etc/passwd |awk -F: '{printf "username :%-8s \t UID : %+d \n",$1,$3}'
    username :root          UID : +0
    username :bin           UID : +1
    username :daemon        UID : +2



    4、操作符
        算数操作符
            x+y
            x-y
            x*y
            x/y
            x^y
            x%y

            -x
            +x     转换成数值

        字符串操作符:没有符号的操作符,字符串连接

        赋值操作符:
            =
            +=
            -=
            *=
            /=
            %=
            ^=
            ++
            --

        比较操作符
            >
            >=
            <
            <=
            !=
            ==

        模式匹配符
            ~     是否匹配
            !~     是否不匹配

        逻辑操作符:
            &&
            ||
            !

        函数调用
            function_name (argu1,argu2,...)

        条件表达式
            selectot?if-true-expression:if-false-expression


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
31
32
33
34
    [iyunv@makeISO ~]# awk -F: '{$3>500?tt="oth user":tt="sys user";printf "%15s:%5d:\t%s\n",$1,$3,tt}' /etc/passwd
               root:    0:    sys user
                bin:    1:    sys user
             daemon:    2:    sys user
                adm:    3:    sys user
                 lp:    4:    sys user
               sync:    5:    sys user
           shutdown:    6:    sys user
               halt:    7:    sys user
               mail:    8:    sys user
               uucp:   10:    sys user
           operator:   11:    sys user
              games:   12:    sys user
             gopher:   13:    sys user
                ftp:   14:    sys user
             nobody:   99:    sys user
               dbus:   81:    sys user
            usbmuxd:  113:    sys user
               vcsa:   69:    sys user
                rpc:   32:    sys user
              rtkit:  499:    sys user
      avahi-autoipd:  170:    sys user
               abrt:  173:    sys user
            rpcuser:   29:    sys user
          nfsnobody:65534:    oth user
          haldaemon:   68:    sys user
                gdm:   42:    sys user
                ntp:   38:    sys user
             apache:   48:    sys user
           saslauth:  498:    sys user
            postfix:   89:    sys user
              pulse:  497:    sys user
               sshd:   74:    sys user
            tcpdump:   72:    sys user



    5、PATTERN
        (1)    empty:匹配每一行
        (2)    /正则表达式/:仅处理能够被匹配到的行
        (3)    关系表达式:结果有真有假,只处理结果为真(非0非空)的情况
        (4)    地址定界:行范围
            awk -F":" '/^root/,/^lp/ {print $1}' /etc/passwd
        (5)    BEGIN/END模式:
            BEGIN{}     仅在开始处理文件中的文本之前执行一次
            END{}         仅在问恩处理完成之后执行一次
            awk 'BEGIN{开始代码}{正文代码}END{结尾代码}' file


1
2
3
    [iyunv@makeISO ~]# awk '/^U/{print $1}' /etc/fstab
    UUID=e20786ee-7475-4afd-b28b-0585dcb3c1a7
    [iyunv@makeISO ~]# awk '!/^#/{print $1}' /etc/fstab



1
2
3
4
5
6
7
    /dev/mapper/vg_makeiso-lv_root
    UUID=e20786ee-7475-4afd-b28b-0585dcb3c1a7
    /dev/mapper/vg_makeiso-lv_swap
    tmpfs
    devpts
    sysfs
    proc



1
2
3
4
5
6
    [iyunv@makeISO ~]# awk -F":" '/^root/,/^lp/ {print $1}' /etc/passwd
    root
    bin
    daemon
    adm
    lp



1
2
3
4
5
6
7
8
9
10
11
    [iyunv@makeISO ~]# cat -n /etc/passwd |grep -C 2 adm
         2    bin:x:1:1:bin:/bin:/sbin/nologin
         3    daemon:x:2:2:daemon:/sbin:/sbin/nologin
         4    adm:x:3:4:adm:/var/adm:/sbin/nologin
         5    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
         6    sync:x:5:0:sync:/sbin:/bin/sync
    [iyunv@makeISO ~]# awk -F":" '(NR>=3&&NR<=6) {print $1}' /etc/passwd
    daemon
    adm
    lp
    sync



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
31
32
33
34
35
36
37
38
    [iyunv@makeISO ~]# awk -F: 'BEGIN{print "username\tuid\n------------------------"}{printf "%-15s %-5d\n",$1,$3}END{print "------------------------\nuser count:"NR}' /etc/passwd
    username    uid
    ------------------------
    root            0   
    bin             1   
    daemon          2   
    adm             3   
    lp              4   
    sync            5   
    shutdown        6   
    halt            7   
    mail            8   
    uucp            10   
    operator        11   
    games           12   
    gopher          13   
    ftp             14   
    nobody          99   
    dbus            81   
    usbmuxd         113  
    vcsa            69   
    rpc             32   
    rtkit           499  
    avahi-autoipd   170  
    abrt            173  
    rpcuser         29   
    nfsnobody       65534
    haldaemon       68   
    gdm             42   
    ntp             38   
    apache          48   
    saslauth        498  
    postfix         89   
    pulse           497  
    sshd            74   
    tcpdump         72   
    ------------------------
    user count:33



    6、常用的action
        (1)    表达式
        (2)    控制语句:if、while
        (3)    组合语句
        (4)    输入语句
        (5)    输出语句
   
    7、控制语句
        if(条件){}
        if(条件){}else{}
        while(条件){}
        do{}while{}
        for(expr1;expr2;expr3){}
        break
        continue
        delete array[index]
        delete array
        exit
        {}

    7.1、if-else
        使用场景:对awk取得的整行或某个字段做条件判断
        awk '{if(condition) statement [else statement]}'


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    [iyunv@makeISO ~]# awk -F: '{if($3>10){print $1,$3}else{print $3,$1}}' /etc/passwd
    0 root
    1 bin
    2 daemon
    3 adm
    4 lp
    5 sync
    6 shutdown
    7 halt
    8 mail
    10 uucp
    operator 11
    games 12
    gopher 13
    ftp 14
    nobody 99



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
31
    [iyunv@makeISO ~]# awk '{if(NF>5)print $0}' /etc/fstab
    # Created by anaconda on Mon Nov 23 10:15:17 2015
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    /dev/mapper/vg_makeiso-lv_root /                       ext4    defaults        1 1
    UUID=e20786ee-7475-4afd-b28b-0585dcb3c1a7 /boot                   ext4    defaults        1 2
    /dev/mapper/vg_makeiso-lv_swap swap                    swap    defaults        0 0
    tmpfs                   /dev/shm                tmpfs   defaults        0 0
    devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
    sysfs                   /sys                    sysfs   defaults        0 0
    proc                    /proc                   proc    defaults        0 0
    [iyunv@makeISO ~]# awk '{if(NF>6)print $0}' /etc/fstab
    # Created by anaconda on Mon Nov 23 10:15:17 2015
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    [iyunv@makeISO ~]# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/vg_makeiso-lv_root
                           18G  8.2G  8.1G  51% /
    tmpfs                 1.9G  228K  1.9G   1% /dev/shm
    /dev/sda1             477M   34M  419M   8% /boot
    [iyunv@makeISO ~]# df -h |awk -F% '{print $1}'
    Filesystem            Size  Used Avail Use
    /dev/mapper/vg_makeiso-lv_root
                           18G  8.2G  8.1G  51
    tmpfs                 1.9G  228K  1.9G   1
    /dev/sda1             477M   34M  419M   8
    [iyunv@makeISO ~]# df -h |awk -F% '{print $1}' |awk '/[[:digit:]]$/{if($NF>=1)print $0}'
                           18G  8.2G  8.1G  51
    tmpfs                 1.9G  228K  1.9G   1
    /dev/sda1             477M   34M  419M   8



    7.2 while
        语法: while(condition) statement
            条件为真进入循环,条件为假退出循环
        使用场景:对一行内的多个字段逐一类似处理时,对数组中的各元素逐一处理时


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    [iyunv@bl2cxtru1341 ~]# awk '/^[[:space:]]*linux/{i=1;while(i<=NF) {print $i,length($i);i++}}' /etc/grub2.cfg
    linux16 7
    /boot/vmlinuz-3.10.0-229.el7.x86_64 35
    root=UUID=a74e310c-ffa3-485e-9744-bf2828cf826f 46
    ro 2
    crashkernel=auto 16
    rhgb 4
    quiet 5
    LANG=en_US.UTF-8 16
    linux16 7
    /boot/vmlinuz-0-rescue-ca2e0b5862c148cabe8c774423b52bce 55
    root=UUID=a74e310c-ffa3-485e-9744-bf2828cf826f 46
    ro 2
    crashkernel=auto 16
    rhgb 4
    quiet 5



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    [iyunv@bl2cxtru1341 ~]# awk '/^[[:space:]]*linux/{i=1;while(i<=NF) {if(length($i)>7)print $i,length($i);i++}}' /etc/grub2.cfg
    /boot/vmlinuz-3.10.0-229.el7.x86_64 35
    root=UUID=a74e310c-ffa3-485e-9744-bf2828cf826f 46
    crashkernel=auto 16
    LANG=en_US.UTF-8 16
    /boot/vmlinuz-0-rescue-ca2e0b5862c148cabe8c774423b52bce 55
    root=UUID=a74e310c-ffa3-485e-9744-bf2828cf826f 46
    crashkernel=auto 16
    [iyunv@bl2cxtru1341 ~]# awk '/^[[:space:]]*linux/{i=1;while(i<=NF) {if(length($i)>7){print $i,length($i)};i++}}' /etc/grub2.cfg
    /boot/vmlinuz-3.10.0-229.el7.x86_64 35
    root=UUID=a74e310c-ffa3-485e-9744-bf2828cf826f 46
    crashkernel=auto 16
    LANG=en_US.UTF-8 16
    /boot/vmlinuz-0-rescue-ca2e0b5862c148cabe8c774423b52bce 55
    root=UUID=a74e310c-ffa3-485e-9744-bf2828cf826f 46
    crashkernel=auto 16



    7.3 do-while
        语法: do statement while (condition)
            至少循环一次

    7.4 for循环
        语法:for(expr1;expr2;expr3) statement
        可以遍历数组中的元素
        语法: for(var in array) {for-body}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    [iyunv@bl2cxtru1341 ~]# awk '/^[[:space:]]*linux/{for(i=1;i<=NF;i++) if(length($i)>7) print $i,length($i) }' /etc/grub2.cfg
    /boot/vmlinuz-3.10.0-229.el7.x86_64 35
    root=UUID=a74e310c-ffa3-485e-9744-bf2828cf826f 46
    crashkernel=auto 16
    LANG=en_US.UTF-8 16
    /boot/vmlinuz-0-rescue-ca2e0b5862c148cabe8c774423b52bce 55
    root=UUID=a74e310c-ffa3-485e-9744-bf2828cf826f 46
    crashkernel=auto 16
    [iyunv@bl2cxtru1341 ~]# awk '/^[[:space:]]*linux/{for(i=1;i<=NF;i++) {if(length($i)>7) print $i,length($i)} }' /etc/grub2.cfg
    /boot/vmlinuz-3.10.0-229.el7.x86_64 35
    root=UUID=a74e310c-ffa3-485e-9744-bf2828cf826f 46
    crashkernel=auto 16
    LANG=en_US.UTF-8 16
    /boot/vmlinuz-0-rescue-ca2e0b5862c148cabe8c774423b52bce 55
    root=UUID=a74e310c-ffa3-485e-9744-bf2828cf826f 46
    crashkernel=auto 16



    7.5 switch
    语法:switch(expression){case VALUE1 or /REGEXP/:statement; case VALUE2 or /REGEXP2/:statement;...;default:statement}

    7.6 break continue
        break [n]
        continue

    7.7 next
        awk提前结束对本行的处理,直接处理下一行


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    [iyunv@bl2cxtru1341 ~]# awk -F: '{if($3%2!=0) next ; print $1,$3}' /etc/passwd
    root 0
    daemon 2
    lp 4
    shutdown 6
    mail 8
    games 12
    ftp 14
    avahi-autoipd 170
    sshd 74
    [iyunv@bl2cxtru1341 ~]# awk -F: '{if($3%2==0) next ; print $1,$3}' /etc/passwd
    bin 1
    adm 3
    sync 5
    halt 7
    operator 11
    nobody 99
    dbus 81
    polkitd 999
    tss 59
    postfix 89



    8 array
        关联数组:array[index-expression]

        index-expression
            1、可以使用任意字符串,字符串需要“”
            2、如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为空串

            若要判断数组中是否存在某元素,要使用“index in array”格式进行

        若要遍历数组中的每个元素,要使用for循环
            for (var in array) {for-body;}
            var会遍历array的每个索引


1
2
3
4
    [iyunv@localhost ~]# awk 'BEGIN{week["1"]="mon";week["2"]="tue";print week["1"]}'
    mon
    [iyunv@localhost ~]# awk 'BEGIN{week["1"]="mon";week["2"]="tue";print week["2"]}'
    tue



1
2
3
    [iyunv@localhost ~]# awk 'BEGIN{week["1"]="mon";week["2"]="tue";for(i in week)print week}'
    mon
    tue



1
2
3
4
5
6
7
8
9
10
11
    [iyunv@makeISO ~]# awk '{ip[$1]++}END{for(i in ip){print i,"\t"ip}}' access.log | sort -k2 -n |tail -10
    180.104.17.116     1217
    27.40.123.82     1219
    1.80.100.57     1272
    116.21.39.78     1300
    180.140.5.152     1434
    36.63.173.86     1442
    120.35.197.97     1786
    117.28.110.114     1898
    218.9.162.248     2451
    124.163.206.86     3013



    练习1、统计/etc/fstab中每个文件系统使用的次数


1
2
    [iyunv@localhost ~]# awk '/^UUID/{fs[$3]++}END{for(i in fs){print i,fs}}' /etc/fstab
    ext4 1



    练习2、统计某文件中单词出现的次数


1
2
3
4
5
6
7
8
9
10
11
    [iyunv@makeISO ~]# awk  '{for(i=1;i<=NF;i++){fs[$i]++}}END{for(i in fs){print fs"\t",i}}' /etc/fstab |sort -n -r |head
    10     0
    7     #
    6     defaults
    3     1
    2     tmpfs
    2     sysfs
    2     swap
    2     proc
    2     ext4
    2     devpts



    9 函数
        9.1 内置函数
            数值处理:
                rand() 返回0和1之间的一个随机数
            字符串处理:
                length() 返回指定字符串的长度
                sub(r,s,[t]) 在t中查找r,替换成s  仅替换第一次出现
                gsub(r,s,[t]) 在t中查找r,替换成s  全部替换
                split(s,a[,r]) 以r为分隔符切割字符s,并将切割后的结果保存到a所表示的数组中

1
2
    [iyunv@makeISO ~]# awk 'BEGIN{print rand(),rand(),rand()}'
    0.237788 0.291066 0.845814



1
2
3
    [iyunv@localhost ~]# netstat -tan |awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print count"\t",i}}'
    2     0.0.0.0
    3     123.119.159.114



        9.2 自定义函数

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-173103-1-1.html 上篇帖子: netstat命令按端口号排序查监听端口 下篇帖子: linux socket Select(笔记)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表