• awk的使用


    awk的使用

    一、awk的作用

    1.用来从文本中截取字符串
    2.用来匹配过滤文本,起到grep的作用

    二、awk里面的分隔符

    1、输入分隔符:

    -F
    -FS=":"
    FS(input field separater)
    
    • 1
    • 2
    • 3

    2、输出分隔符:
    定义OFS=“#”
    OFS(output field separater)

    awk -F: 'OFS="#"{print $1,$3,$4}'  /etc/passwd
    
    • 1

    在这里插入图片描述

    三、.vimrc文件的作用

    vim在启动的时候,会读取这个文件里的配置,进行加载。这个文件里面存放的是vim的命令也就是说,在vim启动的时候传递参数,告诉vim应该首先执行哪些命令

    四、awk的操作处理图

    在这里插入图片描述

    五、awk的完整语法及工作原理

    在这里插入图片描述

    1、完整语法
    awk -F:  'BEGIN{print "###start@@@@"} $3>500&&$3<2000{print $1,$3} END{print "###end####"}' /etc/passwd
        ###start@@@@
        polkitd 999
        chrony 998
        nginx 997
        mahaoliang 1000
        daifurong 1001
        chenyulin 1002
        xieshan 1003
        bashzhang 1004
        bashzhang1 1005
        liu1 1006
        zhangliu1 1007
        liu 1008
        liu2 1009
        wujiaxi 1010  fengdeyong 
        ###end####
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    2、工作原理

    2.1、模式匹配

    精准匹配:必须一模一样,不能多也不能少
    [root@lamp-test logs]# awk -F: '$1 == "feng1" && $3>1009 {print $1,$7,$3}' /etc/passwd
    feng1 /bin/bash 1012
    [root@lamp-test logs]# 
    模糊匹配: 包含,可以多不能少
    [root@lamp-test logs]# awk -F: '$1 ~ /[0-9]$/ && $3>1009 {print $1,$7,$3}' /etc/passwd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.2、常用的内置变量

    NR number of record 行号
    NF number of field 字段数
    $NF  -->最后一个字段 
    $(NF-1) --> 倒数第2个字段
    
    • 1
    • 2
    • 3
    • 4
    3、awk命令操作符

    在这里插入图片描述

    六、查看内存使用的命令:free

    [root@xiaoliu lianxi]# free -m
                  total        used        free      shared  buff/cache   available
    Mem:           1790         191         804           8         793        1447
    Swap:          2047           0        2047
    [root@xiaoliu lianxi]# free -h
                  total        used        free      shared  buff/cache   available
    Mem:          1.7Gi       191Mi       798Mi       8.0Mi       800Mi       1.4Gi
    Swap:         2.0Gi          0B       2.0Gi
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1、选项:

    ​	-m  以M为单位显示内存的使用情况
    ​	-h   以人类能够读懂的格式显示
    
    • 1
    • 2

    2、信息:

    total    是总的物理内存(内存条的大小)
    used   使用了多少内存
    free    剩余多少内存
    shared    共享内存消耗的空间  --》进程和进程之间通信
    buff/cache
    ​	buff:data from memory to disk
    ​	cache:data from disk to memory
    available:可用的内存空间
    	一个新的进程它可以使用的内存空间==free + buff/cache
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3、释放缓存:echo 3 >/proc/sys/vm/drop_caches

    /proc:是内核文件系统,内核是一个软件,控制操作系统的硬件,管理cpu,内存,磁盘,网卡等硬件
    /proc文件系统,也是消耗内存的空间
    
    • 1
    • 2
    [root@xiaoliu lianxi]# free -h
     		total        used        free      shared  buff/cache available
    Mem:    1.7Gi       192Mi        63Mi       8.0Mi    1.5Gi       1.4Gi
    Swap:         2.0Gi          0B       2.0Gi
    [root@xiaoliu lianxi]# echo 3 >/proc/sys/vm/drop_caches #告诉内核取释放缓存空间
    [root@xiaoliu lianxi]# free -h
                  total        used        free      shared  buff/cache   available
    Mem:          1.7Gi       182Mi       1.5Gi       8.0Mi       110Mi       1.4Gi
    Swap:         2.0Gi          0B       2.0Gi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4、查看什么时候使用交换分区

    # 默认是当物理内存使用了70%的时候,就开始使用交换分区
    [root@xiaoliu lianxi]# cat /proc/sys/vm/swappiness 
    30
    
    • 1
    • 2
    • 3
    内核参数优化,提升进程使用的效率,告诉系统尽可能的多使用物理内存,物理内存速度快
    [root@xiaoliu lianxi]# echo 0 >/proc/sys/vm/swappiness 
    [root@xiaoliu lianxi]# cat /proc/sys/vm/swappiness 
    0
    [root@xiaoliu lianxi]# echo 10 >/proc/sys/vm/swappiness 
    [root@xiaoliu lianxi]# cat /proc/sys/vm/swappiness 
    10
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5、内核参数配置文件
    系统开机启动的时候,内核对读取这个配置文件,进行相关参数的设置/etc/sysctl.conf

    七、压缩连续的字符串:tr

    将连续的空格压缩成一个空格

    tr -s “ ”

    八、小练习熟悉awk的使用

    在这里插入图片描述

    1.只显示df -h结果的第一列文件系统
    	df -Th|awk '{print $1}'
    2.显示passwd文件的第5行和第10行的行号和用户名
    	awk -F: 'NR==5||NR==10{print NR,$1}' /etc/passwd
    3.使用NF变量显示passwd文件倒数第二列的内容
    	awk -F: '{print $(NF-1)}' /etc/passwd
    4.显示passwd文件中第5到第10行的用户名
    	awk -F: 'NR>=5&&NR<=10{print $1}' /etc/passwd
    5.显示passwd文件中第7列不是bash的用户名
    	awk -F: '$7 !~/bash/{print $1}' /etc/passwd
    6.显示passwd文件中行号是5结尾的行号和整行内容
    	awk -F: 'NR ~/5/{print NR,$0}' /etc/passwd
    7.用ifconfig/ip add  只显示ip
    yum  install net-tools  -y -->安装ifconfig命令的软件
    	ifconfig|awk 'NR==2 {print $2}'
    8.ifconfig 命令后使用awk显示ens33的入站流量和出站流量(字节)
    	ifconfig |awk 'NR==5||NR==7 {print $1,$5}
    9.统计/etc/passwd文件里以r开头的用户的数量,并且显示出用户名
    	awk -F: '$1 ~/^r/{print $1}' /etc/passwd
    10.显示每隔2秒的流量的变化
    	watch -n 2 -d "ifconfig|awk 'NR==5{print $5}'"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    九、awk使用shell变量

    [root@xiaoliu lianxi]# mn=mengmeng
    [root@xiaoliu lianxi]# awk -F: "\$1 ~/$mn/{print \$0}" /etc/passwd
    shimengmeng:x:1009:1009::/home/shimengmeng:/bin/bash
    mengmeng:x:1073:1073::/home/mengmeng:/bin/bash
    mengmeng1:x:1074:1074::/home/mengmeng1:/bin/bash
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    十、awk中的字段求和

    [root@xiaoliu lianxi]# awk 'NR>1{sum+=$3}END{print sum}' gread.txt 480
    [root@xiaoliu lianxi]# awk 'BEGIN{num=0}NR>1{sum+=$3}END{print sum}' gread.txt 
    480
    
    • 1
    • 2
    • 3

    十一、awk里面的内置函数(lentgh,substr)

    1、统计没有设置密码的用户的数量,同时输出用户名

    awk -F: 'length($2)<=2 {print $1;sum++}END{print sum}' /etc/shadow
    
    • 1

    2、统计没有设置密码的用户的数量,同时输出用户名前2个字符

    awk -F: 'length($2)<=2 {print substr($1,1,2);sum++}END{print sum}' /etc/shadow
    
    • 1

    十二、awk里面的流程控制if分支

    [root@localhost lianxi]# cat /etc/passwd|awk -F: '{if (length($1)==3) print $0}'
    bin:x:1:1:bin:/bin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    liu:x:1008:1008::/home/liu:/bin/bash
    [root@localhost lianxi]#
    [root@localhost lianxi]# cat /etc/passwd|awk -F: '{if (length($1)==3) print $0 ; else print $1}'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    练习1:

    用户的类型:
    uid==0  超级用户
    uid在1~999 系统用户
    uid>=1000 普通用户
    
    • 1
    • 2
    • 3
    • 4
    # 方法一、
    awk -F: '{if($3 == 0)print $1"超级用户";else if($3>=1 && $3<=999) print $1"系统用户";else if($3>=1000) print $1"普.通用户"}' /etc/passwd
    # 方法二、
    [root@localhost lianxi]# awk -F: '{if($3==0) print $1"是超级用户";else if($3>1&&$3<=999) print $1"是系统用户";else print $1"是普通用户"}'  /etc/passwd
    
    • 1
    • 2
    • 3
    • 4

    练习2:

    3个变量: 统计3种类型的用户, 统计用户类型的个数
    用户的类型:
    uid==0  超级用户
    uid在1~999 系统用户
    uid>=1000 普通用户
    
    • 1
    • 2
    • 3
    • 4
    • 5
    awk -F: '{if($3 == 0){print $1"超级用户";num1++;} else if($3>=1 && $3<=999){print $1"系统用户";num2++;} else if($3>=1000){print $1"普通用户";num3++}}END{print "超级用户的数量:"num1,"系统用户的数量:"num2,"普通用户的数量:"num3}' /etc/passwd
    
    • 1

    注:if语句后面执行多个命令的时候,使用{}括起来,最后的命令接;结尾,外面的else if和else前面不需要接;了

    十三、awk里面的for循环格式

    for (i=0;i<10;i++) {print $i;}
    for (i in array) {print array[i]}
    
    • 1
    • 2

    十四、awk里面的数组

    统计每个省份总共得到了多少票数

    [root@xiaoliu lianxi]# cat vote.txt 
    	山东 aa  2
    	河南 bb  3
    	江西 cc 3
    	湖南 aa 40
    	山东 bb 10
    	江西 dd 6
    	河南 cc 3
    	湖南 cc 3
    
    awk '{vote[$1]+=$3}END{for (i in vote) print i,vote[i]}' vote.txt |sort -k 2 -n
    
    	河南 6
    	江西 9
    	山东 12
    	湖南 43
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    十五、awk里的综合练习

    练习1:

    对nginx的日志文件access.log进行分析,分析出单个ip地址累计下载获取的文件大小的总数(对每次访问数据的大小进行求和),显示下载总数最大的前100个ip地址和下载文件大小,按照下载文件大小的降序排列,显示格式如下:
    175.8.134.239 3456
    172.105.77.209 78956

    61.147.15.67 112345678

    #答案:
    awk '{access[$1]+=$10}END{for (i in access) print i,access[i]}' access.log |sort -k 2 -nr|head -100
    
    • 1
    • 2
    练习二:

    以下是nginx日志的字段含义

    $time_iso8601|$host|$http_cf_connecting_ip|$request|$status|$body_bytes_sent|$http_referer|$http_user_agent
    -------------------------------------
    2019-04-25T09:51:58+08:00|a.google.com|47.52.197.27|GET /v2/depth?symbol=aaa HTTP/1.1|200|24|-|apple
    2019-04-25T09:52:58+08:00|b.google.com|47.75.159.123|GET /v2/depth?symbol=bbb HTTP/1.1|200|407|-|python-requests/2.20.0
    2019-04-25T09:53:58+08:00|c.google.com|13.125.219.4|GET /v2/ticker?timestamp=1556157118&symbol=ccc HTTP/1.1|200|162|-|chrome
    2019-04-25T09:54:58+08:00|d.shuzibi.co|-||HEAD /justfor.txt HTTP/1.0|200|0|-|-
    2019-04-25T09:55:58+08:00|e.google.com|13.251.98.2|GET /v2/order_detail?apiKey=ddd HTTP/1.1|200|231|-|python-requests/2.18.4
    2019-04-25T09:56:58+08:00|f.google.com|210.3.168.106|GET /v2/trade_detail?apiKey=eee HTTP/1.1|200|24|-|-
    2019-04-25T09:57:58+08:00|g.google.com|47.75.115.217|GET /v2/depth?symbol=fff HTTP/1.1|200|397|-|python-requests/2.18.4
    2019-04-25T09:58:58+08:00|h.google.com|47.75.58.56|GET /v2/depth?symbol=ggg HTTP/1.1|200|404|-|safari
    2019-04-25T09:59:58+08:00|i.google.com|188.40.137.175|GET /v2/trade_detail?symbol=hhh HTTP/1.1|200|6644|-|-sfdf
    2019-04-25T10:01:58+08:00|j.google.com|2600:3c01:0:0:f03c:91ff:fe60:49b8|GET /v2/myposition?apiKey=jjj HTTP/1.1|200|110|-|scan
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.1、计算每分钟的带宽(body_bytes_sent)

    #答案
    [root@xiaoliu lianxi]# awk -F"|" '{width[substr($1,1,16)]+=$6}END{for (i in width) print i,width[i]}' width.txt |sort -n
    	2019-04-25T09:51 24
    	2019-04-25T09:52 407
    	2019-04-25T09:53 162
    	2019-04-25T09:54 200
    	2019-04-25T09:55 231
    	2019-04-25T09:56 24
    	2019-04-25T09:57 397
    	2019-04-25T09:58 404
    	2019-04-25T09:59 6644
    	2019-04-25T10:01 110
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.2、统计每个URI(即不带问号?前面的内容)的每分钟的频率/v2/myposition?apiKey=jjj 中的/v2/myposition

    #答案
    [root@xiaoliu lianxi]# awk -F"[|?]" '{frequn[substr($1,1,16)substr($4,5,16)]+=1}END{for (i in frequn) print i,frequn[i]}' width.txt |sort -n
    	2019-04-25T09:51/v2/depth 1
    	2019-04-25T09:52/v2/depth 1
    	2019-04-25T09:53/v2/ticker 1
    	2019-04-25T09:54 1
    	2019-04-25T09:55/v2/order_detail 1
    	2019-04-25T09:56/v2/trade_detail 1
    	2019-04-25T09:57/v2/depth 1
    	2019-04-25T09:58/v2/depth 1
    	2019-04-25T09:59/v2/trade_detail 1
    	2019-04-25T10:01/v2/myposition 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    JAVA-中国矿业大学作业-编写程序,将字符串“你好,欢迎来到JAVA世界”对其中的“java“进行截取,输出截取字母和它在字符串中的位置
    spark中的bykey
    家电翻页电子画册制作秘籍,轻松打造炫酷电子书!
    【算法题】2909. 元素和最小的山形三元组 II
    Android源码分析 - Framework层的Binder(客户端篇)
    CFdiv2-Two Pizzas-(预处理+状态压缩)
    Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs笔记
    【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(三)-向量指令格式
    [论文精读|博士论文]面向文本数据的关系抽取关键技术研究
    10年测试工程师 —— 手把手教会你做前端性能测试(超详细)
  • 原文地址:https://blog.csdn.net/weixin_47661174/article/details/125626665