• awk入门


    第1章 awk主要内容

    取列  统计 计算

    1. 执行过程
    2. '找谁{干啥}'

    '模式{动作}'

    1. 正则表达式作为条件
    2. 从哪里来,到哪里去条件(范围)
    3. BEGIN 和END
    4. awk数组-进行统计

    1.1 awk的执行过程

    [root@hsots ~]# awk -F: 'NR==2{print $NF}' passwd.txt

    /sbin/nologin

    1.2 '模式{动作}'

         '条件/找谁{动作}'

    1.3 awk眼中的 行与列

     field     字段,列

    record     记录,行

    awk默认有一把菜刀 - 空格系列(单独的空格,连续的空格,tab键)

    -F 指定分隔符

    -F: === -vFS=":"    OFS ===output field separator 输出每一列的的时候使用的分割符号

    awk的内置变量 

    FS

    NF ------number of field 每一行有多少列

    NR ------number ofrecord  记录号 行号

    $数字   取某一列

    $0      取出这一行

    RS ------每一行的分隔符(每一行的结束标记)换行符

    OFS

    1.4 正则表达式的使用

    ^   某一列以...开头

    $   某一列以...结尾

    1.4.1 #awk函数 

    gsub(r,s [, t])  

    gsub(/找谁/,"替换成什么" ,替换那部分的内容)

    测试环境

    mkdir -p /server/files/
    cat >>/server/files/reg.txt<<EOF
    Zhang Dandan    41117397   :250:100:175
    Zhang Xiaoyu    390320151  :155:90:201
    Meng  Feixue    80042789   :250:60:50
    Wu    Waiwai    70271111   :250:80:75
    Liu   Bingbing  41117483   :250:100:175
    Wang  Xiaoai    3515064655 :50:95:135
    Zi    Gege      1986787350 :250:168:200
    Li    Youjiu    918391635  :175:75:300
    Lao   Nanhai    918391635  :250:100:175
    EOF

     awk中正则的使用

    [root@hsots ~]# awk '/Li/' /server/files/reg.txt

    Liu   Bingbing  41117483   :250:100:175

    Li    Youjiu    918391635  :175:75:300

    显示出第二列是包含X

    [root@hsots ~]# awk '$2~/X/' /server/files/reg.txt

    Zhang Xiaoyu    390320151  :155:90:201

    Wang  Xiaoai    3515064655 :50:95:135

    显示Xiaoyu的姓氏和ID号码

    [root@hsots ~]# awk '$2~/Xiaoyu/{print $1,$3}' /ses/reg.txt

    Zhang 390320151

    显示所有ID号码最后一位数字是1或5的人的全名

    [root@hsots ~]# awk '$3~/[15]$/{print $1,$2}' iles/reg.txt

    Zhang Xiaoyu

    Wu Waiwai

    Wang Xiaoai

    Li Youjiu

    Lao Nanhai

    姓氏是Zhang的人,显示他的第二次捐款金额及她的名字

    [root@hsots ~]# awk -F "[ :]+" '$1~/Zhang/{print $1$2,$(NF-1)}' /server/files/reg.txt

    ZhangDandan 100

    ZhangXiaoyu 90

    显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135 

    [root@hsots ~]# awk '$2~/Xiaoyu/ {gsub (/:/,"$",$NF);print $NF}' /server/files/reg.txt

    $155$90$201

    写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin),如果是显示用户名字

    ~   包含
    !~不包含
    [root@oldboyedu-40 files]# awk -F: '$NF!~/nologin$/{print $1,$NF}' /etc/passwd
    root /bin/bash
    sync /bin/sync
    shutdown /sbin/shutdown
    halt /sbin/halt
    oldboy /bin/bash
    lidao /bin/bash
    alex888 /bin/bash
    user01 /bin/bash
    user02 /bin/bash
    user03 /bin/bash
    oldboy1978 /bin/bash
    stu01 /bin/bash
    stu02 /bin/bash
    stu03 /bin/bash
    kaifa /bin/bash

    column -t    对齐

    1.5 特殊条件 BEGIN END

    1.5.1 #BEGIN{}  BEGIN里面的内容会在 awk读取文件之前 运行

    ##测试 进行计算

    [root@hsots ~]# awk 'BEGIN{print 1/3}'

    0.333333

    ##BEGIN里面定义awk内置变量

    -F: ====   -vFS=":" ===== BEGIN{FS=":"}

    ##

    [root@oldboyedu-40 files]# awk 'BEGIN{print "姓氏","名字"}{print $1,$2}' reg.txt

    姓氏 名字

    Zhang Dandan

    Zhang Xiaoyu

    Meng Feixue

    Wu Waiwai

    Liu Bingbing

    Wang Xiaoai

    Zi Gege

    Li Youjiu

    1.5.2 END{}  END里面的内容 会在awk读取完文件内容后执行

       ##先计算然后在END里面输出结果

       ##先计算在输出

    企业案例:统计出/etc/services文件里面的空行数量

    [root@hsots ~]# awk '/^$/{i++}END{print i}' /etc/services

     seq100 >num.txt 计算这个文件每一行数字相加的结果

    [root @hsots ~]# awk '{i=i+$1}END {print i}' num.txt

    5050

    i=i+1 ====i++  统计数量 计数

    i=i+$0 累计相加 累加

    1.6 awk数组

    分类计算

    统计图片.jpg出现了多少次

    统计视频.avi出现了多少次

    $7~/.jpg/{a++}$7~/.avi/{b++}

    假设我们的酒店

    酒店<===>hotel

    酒店里面有几个房间110,119,120,114,401这几个房间。

    酒店的110房间<===> hotel[110]

    酒店的119房间<===> hotel[119]

    酒店的120房间<===> hotel[121]

    酒店房间里面入住客人

    hotel[110]="lidao" ;hotel[119]="tanjiaoshou";hotel[121]="taojin"

     

    [root@oldboyedu-40 files]# awk 'BEGIN{hotel[110]="lidao" ;hotel[119]="tanjiaoshou";hotel[121]="taojin";

    > print hotel[110],hotel[119],hotel[121]}'

    lidao tanjiaoshou taojin

     

    #自动显示房间的内容

    awk 'BEGIN{hotel[110]="lidao" ;hotel[119]="tanjiaoshou";hotel[121]="taojin";

    for(pol in hotel)  #for pol in 1 2 3 4 5

    print pol,hotel[pol]

    }'

     

     

    for(pol in hotel)  pol变量对酒店进行循环/查房

     

    print pol,hotel[pol]

    #pol 得到-房间的号码

    #hotel[pol]    哪个酒店的哪个房间

     

    [root@oldboyedu-40 files]# awk 'BEGIN{hotel[110]="lidao" ;hotel[119]="tanjiaoshou";hotel[121]="taojin";

    for(pol in hotel)

    print pol,hotel[pol]

    }'

    110 lidao

    121 taojin

    119 tanjiaoshou

     

    ##hotel -------数组的名字

    ##110 119 121 -数组元素的下标(名字)

    ##hotel[110]  -房间里面的内容

    企业面试题1:统计域名访问次数
    处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和sohu面试题)
    http://www.etiantian.org/index.html
    http://www.etiantian.org/1.html
    http://post.etiantian.org/index.html
    http://mp3.etiantian.org/index.html
    http://www.etiantian.org/3.html
    http://post.etiantian.org/2.html

    方法1

    [root@hsots ~]# awk -F "[/]+" '{print $2}' 1.txt|sort

    mp3.etiantian.org

    post.etiantian.org

    post.etiantian.org

    www.etiantian.org

    www.etiantian.org

    www.etiantian.org

    [root@hsots ~]# awk -F "[/]+" '{print $2}' 1.txt|sort|uniq

    mp3.etiantian.org

    post.etiantian.org

    www.etiantian.org

    [root@hsots ~]# awk -F "[/]+" '{print $2}' 1.txt|sort|uniq -c

          1 mp3.etiantian.org

          2 post.etiantian.org

          3 www.etiantian.org

    #sort 排序 默认是按照字母顺序

    #uniq 合并 把相邻的的的一模一样的行 合并 -c显示重复的数量

    方法2 awk数组

    [root@hsots ~]# awk -F "[/]+" '{i[$2]++}END{for (a in i) print a ,i[a]}' 1.txt |column -t

    mp3.etiantian.org   1

    post.etiantian.org   2

    www.etiantian.org  3

    第2章 课后题目

    2.1 统计secure文件中谁在破解你的密码(统计出破解你密码的ip地址出现的次数)

    [root@hsots ~]# awk '$6~/Failed/{i[$(NF-3)]++}END{for (a in i)print a ,i[a]}' secure-20161219 |column -t|sort -nrk2|head

    2.2 统计access.log文件中对ip地址去重并统计重复数

    [root@hsots ~]# awk '{i[$1]++}END{for (a in i)print a ,i[a]}' access.log |sort -nk2|column -t

    2.3 统计access.log文件中网站一共使用了多少流量

    [root@hsots ~]#  awk '{i=i+$10}END{print i}' access.log

    2478496663

    2.4 统计access.log文件中每个ip地址使用了多少流量

    [root@hsots ~]# awk '{i[$1]=i[$1]+$10}END{for(a in i)print a,i[a]}' access.log|column -t

     

  • 相关阅读:
    iOS高仿微信悬浮窗、忍者小猪游戏、音乐播放器、支付宝、今日头条布局滚动效果等源码
    iOS宇宙大战游戏、调试工具、各种动画、AR相册、相机图片编辑等源码
    android支付宝首页、蚂蚁森林效果、视频背景、校园电台、载入收缩动画等源码
    iOS天气动画、高仿QQ菜单、放京东APP、高仿微信、推送消息等源码
    android高仿抖音、点餐界面、天气项目、自定义view指示、爬取美女图片等源码
    Java_WebKit_ZC01
    Java_WebKit
    ZC_RemoteThread
    运行jar_测试代码
    运行jar_命令
  • 原文地址:https://www.cnblogs.com/dzc-/p/9754791.html
Copyright © 2020-2023  润新知