• awk命令用法


    1.awk命令简介:
    awk是一种可以处理数据、产生格式化报表的语言,功能十分强大。
    awk的工作方式是读取数据,将每一行数据视为一条记录(record)每笔记录以字段分隔符分成若干字段,然后输出各个字段的值.

    2.awk常用的作用格式:
    awk “样式” 文件: 把符合样式的数据行显示出来。
    awk { 操作 } 文件: 对每一行都执行{}中的操作。
    awk " 样式 { 操作 }" 文件: 对符合样式的数据行,执行{}中的操作.

    3.用例:
    awk的用法1:

    1
    awk `/La/` dataf3       #显示含La的行。

    awk的用法2:

    1
    awk -F ":" '{print $1,$2}' /etc/passwd  #以“:”为分割,显示/etc/passwd每一行的第1和第2个字段。$1代表第1个字段,$2代表第2个字段,其他类推.

    awk的用法3:

    1
    awk '/La/{ print $1,$2 }' dataf3  #将含有La关键字的数据行的第1及第2个字段显示出来.默认使用空格分割.

    awk的用法4:

    1
    awk -F : '/^www/{print $3,$4}' /etc/passwd  # 使用选项 -F,指定:为分隔符,账号www的uid(第3个字段)及gid(第4个字段)显示出来.

    awk的用法5:

    1
    2
    3
    4
    [root@localhost~]# awk -F : '/^r/{print $1}' /etc/passwd        #显示以r开头的行的第一个字段
    root
    rpc
    rpcuser

    awk的用法6:

    1
    2
    3
    4
    5
    [root@localhost~]# awk -F : '$3>=500{print $1,$3}' /etc/passwd   #找出$3这个字段的id大于等于500的行,并显示1、3列
    www 500
    cacti 501
    nagios 502
    vsftpd 503

    awk的用法7:

    1
    2
    3
    4
    5
    6
    [root@localhost~]# awk -F : '$7~"bash"{print $1,$7}' /etc/passwd        #匹配出$7是bash的行,如果为真则打印出来
    root /bin/bash
    mysql /bin/bash
    www /bin/bash
    cacti /bin/bash
    nagios /bin/bash

    awk的用法8:

    1
    2
    3
    4
    5
    6
    7
    [root@localhost~]# awk -F : '$7!~"bash"{print $1,$7}' /etc/passwd       #取出$7不是bash的行并打印出来
    bin /sbin/nologin
    daemon /sbin/nologin
    adm /sbin/nologin
    lp /sbin/nologin
    sync /bin/sync
    shutdown /sbin/shutdown

    awk扩展:

    实例操作:
    [root@localhost]# more awk.txt

    1
    2
    07.46.199.184 [28/Sep/2010:04:08:20] "GET /robots.txt HTTP/1.1" 200 0 "msnbot"123.125.71.19 [28/Sep/2010:04:20:11] "GET /
    HTTP/1.1" 304 - "Baiduspider

    NF的用法:

    1. $NF 来打印最后一个字段:

    1
    2
    3
    [root@localhost]# awk '{print $NF}' awk.txt    
    /
    "Baiduspider

    2. $(NF-2):表示从右向左打印每行第二个字段.  

    1
    2
    3
    [root@localhost]# awk '{print $(NF-2)}' awk.txt
    [28/Sep/2010:04:20:11]
    304

    BEGIN{}区域指示用法:

    1.OFS的作用是存储输出字段的分隔符

    1
    2
    3
    4
    5
    [root@localhost~]# awk -F : 'BEGIN{OFS="+++"}/^www/{ print $1 , $2 , $3 , $4 ,$5 }' /etc/passwd     
    www+++x+++500+++500+++
     
    # 以 ":" 为分隔符,+++为输出字段分隔符,将账号www用户的第1-5栏显示出来.
    本例中,BEGIN{}区域指示awk一开始先做初始化的操作,即设定OFS="+++".变量OFS的作用是存储输出字段的分隔符.接着,寻找www的账户行找到后,使用print印出第1至第5个字段,且彼此使用+++隔开.

    2.FS也就是字段分隔符的用法:指定输入分隔符---读取文本时,所使用的字段分隔符.

    1
    2
    [root@localhost]# awk '{print $2}' awk.txt | awk 'BEGIN{FS=":"}''{print $1}'
    [28/Sep/2010

    3.RS表示记录分割符--输入文本信息所使用的换行符

    从tomcat日志catalina.out中截取2014-10-13日,在07:00-15:00时间段的日志记录,并保存.

    1
    2
    3
    4
    awk 'BEGIN{RS="2014-10-13"}$1>"07:00:00"&&$1<"15:50:00"{print RS,$0}' catalina.out > catalins_link.log
           FS表示操作的时候以什么为分割符
           RS表示记录分割符(Record Separator)
           即RS表示的是awk操作最小单位的边界,而FS是这个最小单位中分割的符号

    NR :表示打印当前正在处理的输入的行号

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    awk '{print NR ") " $1 " -> " $(NF-2)}' awk.txt
    其中:
            print NR :表示打印当前正在处理的输入的行号
                  “ )”:表示以半括号将行号括起来.也可以换成任意的符号,如 ]、#、@、等
     
                   $1:  表示打印出第一列的数据.
     
           $(NF-2): 表示从后向前打印出倒数两列数据.
     
    输出:
     
    1) 07.46.199.184 -> 2002) 123.125.71.19 -> 304

    常用操作:

    取得系统内存大小:

    1
    cat /proc/meminfo | awk '/MemTotal/{ print $2 }'

    从catalina.out中截取2014-10-13日,在07:00-15:00时间段的日志记录,并保存.

    1
    awk 'BEGIN{RS="2014-10-13"}$1>"07:00:00"&&$1<"15:50:00"{print RS,$0}' catalina.out > 11106.log

    过滤出nginx日志中状态码不是200的请求.

    1
    2
    3
    cat access.log |awk '$10!="200"{print $10}'
     
    awk '$9 !~ /200/ {print $0}' access.log

    统计访问时间大于5mm的URL,并进行排序

    1
    awk '$NF>5 {print $0}' access_mmall.log|awk '{print $12}'|awk -F? '{print $1}'|sort|uniq -c|sort -rbg

    用awk来实现奇数行和偶数行的输出,思路很简单,就是判断NR变量。NR是行号,行号是2的倍数,自然是偶数行。 

    要处理的文件内容如下所示:

    复制代码
    $ cat 1.txt 
    1       Jan
    2       Feb
    3       Mar
    4       Apr
    5       May
    6       Jun
    7       Jul
    8       Aug
    9       Sep
    10      Oct
    11      Nov
    12      Dec
    复制代码

    输出奇数行:

    不加{print}语句也能默认输出整行,例如

    复制代码
    $ awk NR%2 1.txt  
    1       Jan
    3       Mar
    5       May
    7       Jul
    9       Sep
    11      Nov
    复制代码

    如果还不懂看这个你就懂了,用NR对2取模,当余数为1时,awk的执行模式判断为真,就会执行默认的{print}输出奇数行,当余数不为1时,判断为假,不执行输出,所以偶数行就不会输出。

    复制代码
    $ awk '{if(NR%2==1)print $0}' 1.txt       
    1       Jan
    3       Mar
    5       May
    7       Jul
    9       Sep
    11      Nov
    复制代码

    输出偶数行

    复制代码
    $ awk NR%2==0 1.txt  
    2       Feb
    4       Apr
    6       Jun
    8       Aug
    10      Oct
    12      Dec
    复制代码

    或者用如下方法取反,也可以去除偶数行.

    复制代码
    $ awk '!(NR%2)' 1.txt 
    2       Feb
    4       Apr
    6       Jun
    8       Aug
    10      Oct
    12      Dec
    复制代码
     
    转自:https://www.cnblogs.com/saneri/p/5484965.html
  • 相关阅读:
    【NOIP2016提高A组集训第14场11.12】随机游走
    poj2378 树形DP
    简单博弈论总结加例题解析
    uva11426 欧拉函数应用
    poj3090欧拉函数求和
    lightOJ1370 欧拉函数性质
    hdu4497 正整数唯一分解定理应用
    hdu1215 正整数唯一分解定理应用
    lightoj 1236 正整数唯一分解定理
    素数筛两种方法
  • 原文地址:https://www.cnblogs.com/A121/p/10621213.html
Copyright © 2020-2023  润新知