一,awk的作用

1,用途

AWK是一种处理文本文件的语言,

是一个强大的文本分析工具

2,awk和sed的区别

awk适合按列(域)操作,

sed适合按行操作

awk适合对文件的读取分析,

sed适合对文件的编辑

说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

对应的源码可以访问这里获取: https://github.com/liuhongdi/

说明:作者:刘宏缔 邮箱: 371125307@qq.com

二,查看awk命令所属的包

[root@blog ~]# whereis awk
awk: /usr/bin/awk /usr/libexec/awk /usr/share/awk /usr/share/man/man1/awk.1.gz /usr/share/man/man1p/awk.1p.gz [root@blog ~]# rpm -qf /usr/bin/awk
gawk-4.2.1-1.el8.x86_64

可以看到awk所属的包是gawk,

如果系统提示找不到awk命令时,

可以用dnf命令安装

[root@blog ~]# dnf install gawk

另外:我们使用的awk命令其实是gawk(gnu awk)

仍然叫awk其实是因为向unix上的awk命令兼容

awk命令其实是到gawk命令的一个符号链接

[root@blog ~]# ll /usr/bin/awk
lrwxrwxrwx. 1 root root 4 May 11 2019 /usr/bin/awk -> gawk

三, 查看awk的版本和帮助

1,查看版本

[root@blog ~]# awk --version
GNU Awk 4.2.1, API: 2.0 (GNU MPFR 3.1.6-p2, GNU MP 6.1.2)
Copyright (C) 1989, 1991-2018 Free Software Foundation.
...

2,查看帮助

[root@blog ~]# awk --help 

3,查看手册

[root@blog ~]# man awk

四,awk应用例子之一:查看磁盘占用高的分区

1, 得到使用20%以上的分区

先看df的结果:

[liuhongdi@centos8 ~]$ df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 10M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/cl-root 50G 9.1G 41G 19% /
/dev/mapper/cl-home 26G 1.2G 24G 5% /home
/dev/sda1 976M 266M 644M 30% /boot
tmpfs 376M 1.2M 375M 1% /run/user/42
tmpfs 376M 4.6M 372M 2% /run/user/1000
/dev/sr0 6.7G 6.7G 0 100% /run/media/liuhongdi/CentOS-8-BaseOS-x86_64

#sed '1d' :删除第一行(表头)

#$1..   :  第1列..

#sed s/%//g :  替换百分号%为空

[liuhongdi@centos8 ~]$ df -h|sed '1d'|awk '{print $1,$5,$6}'|sed s/%//g |awk '{if($2>20) print $1,"used",$2"%",$3}'
/dev/sda1 used 30% /boot
/dev/sr0 used 100% /run/media/liuhongdi/CentOS-8-BaseOS-x86_64

2,查询挂载到/根目录且使用已用空间百分比大于0的分区

先看df的结果

[root@blog ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 7.5G 0 7.5G 0% /dev
tmpfs 7.5G 0 7.5G 0% /dev/shm
tmpfs 7.5G 500K 7.5G 1% /run
tmpfs 7.5G 0 7.5G 0% /sys/fs/cgroup
/dev/vda1 100G 14G 87G 14% /
/dev/vdb1 500G 3.6G 497G 1% /databak
tmpfs 1.5G 0 1.5G 0% /run/user/1000

查询

[root@blog ~]# df -h|sed '1d'|awk '{print $1,$5,$6}'|sed s/%//g |awk '{if($2>0 && $3=="/") print $1,"used",$2"%",$3}'
/dev/vda1 used 14% /

五,awk应用例子之二:用户管理

1,查询所有使用bash做为shell的用户

说明;有登录bash的权限就存在风险,一般的用户是使用/sbin/nologin作为shell

#-F:    指定列的分隔符是冒号:

[liuhongdi@centos8 ~]$ grep '/bin/bash' /etc/passwd | awk -F: '{print $1}'
root
liuhongdi

用第7列指定/bin/bash也可以

[root@blog ~]$ awk -F: '$7=="/bin/bash"' /etc/passwd  | awk -F: '{print $1}'

2,得到所有系统用户(uid<1000)

 [root@blog ~]$  awk -F: '$3 < 1000' /etc/passwd

六,awk应用例子之三:nginx日志分析

1,访问量最高的前10个IP

#sort: 排序

#uniq:去除重复的行,

#uniq: -c或--count 在每列旁边显示该行重复出现的次数

#sort:排序

#sort -k1 :按第一个列进行排序

#sort -k1 -nr: n:按数字排序 -r:倒排

#head -n10: 取前10行

[root@blog nginxlogs]# awk '{print $1}' file_meet.access_log |sort | uniq -c |sort -k1 -nr |head -n10 

2,访问量大于100的IP

[root@blog nginxlogs]# awk '{print $1}' file_meet.access_log |sort |uniq -c |sort -k1 -nr | awk '{if ($1 > 100) print}'

3,指定时间范围内访问量最高的10个ip

#$4>="[11/May/2020:08:00:00" && $4<="[11/May/2020:08:59:59"

#用来指定一个时间段

[root@blog nginxlogs]#  awk '$4>="[11/May/2020:08:00:00" && $4<="[11/May/2020:08:59:59"' file_meet.access_log | awk '{print $1}' file_meet.access_log |sort | uniq -c |sort -k1 -nr |head -n10

4,统计访问次数最高的前10个url

[root@blog nginxlogs]# awk '{print $7}' file_meet.access_log |sort|uniq -c|sort -k1 -rn|head -n10

5,前一分钟的访问次数

#date=$(date -d '-1 minute' +%d/%b/%Y:%H:%M):

#得到前一分钟的时间

#-vdate=$date: 定义一个变量,变量名是date

#'$4>="["date":00" && $4<="["date":59"' :从前一分钟时间:00到前一分钟时间:59

#wc -l :统计有多少行

[root@loadserver nginxlogs]$ date=$(date -d '-1 minute' +%d/%b/%Y:%H:%M);awk -vdate=$date '$4>="["date":00" && $4<="["date":59"' ilc_ssl.access.log | wc -l

6,前5分钟的访问次数

注意两个变量的获取:

时间的定义必须与nginx的日志格式一致,否则会导致不能得到数据

[root@loadserver nginxlogs]$ date_begin=$(date -d '-6 minute' +%d/%b/%Y:%H:%M);date_end=$(date -d '-1 minute' +%d/%b/%Y:%H:%M);awk -v date_begin=$date_begin -v data_end=$date_end '$4>="["date_begin":00" && $4<="["date_end":59"' ilc_ssl.access.log | wc -l

说明:date 的-d参数,用来通过字符串的描述得到时间

-d, --date=STRING

display time described by STRING, not ‘now’

附:date的时间格式:

%d   day of month (e.g, 01)
%b locale’s abbreviated month name (e.g., Jan)
%H hour (00..23)
%M minute (00..59)
%Y year

这个时间可以通过date的手册来获取

[root@loadserver nginxlogs]$ man date

7,统计每个URL访问内容的总大小

#处理完成后,以行文本后执行,一般用来处理输出结果

#可以看到awk默认是以空格区分的列,

#第7列是url,第10列是$body_bytes_sent

[root@blog nginxlogs]$ awk '{a[$7]++;size[$7]+=$10}END{for(i in a)print a[i],size[i],i}' file_meet.access_log

8,统计每个ip出现404的数量

[root@blog nginxlogs]$ awk '{if($9~/404/)a[$1" "$9]++}END{for(i in a)print i,a[i]}' file_meet.access_log 

9,打印出所有报404错误的url

[root@loadserver nginxlogs]$ awk '($9 ~ /404/)' ilc_ssl.access.log |awk '{print $9, $7}' |sort

10,查日志中盗链的url

[root@loadserver nginxlogs]$ awk -F\" '($2 ~ /\.(jpg|gif|png)/ && $4 !~ /^https:\/\/www\.ilc\.com/ && $4 != "-") {print $4}' ilc_ssl.access.log | sort |uniq -c |sort

七,awk应用例子之四:网络管理

1,用awk查询得到ip地址

[root@loadserver nginxlogs]$ ip addr show eth0 | awk -F "[ /]+" '/inet /{print $3}'
172.17.173.28

也可用ifconfig(所属软件包已不更新,不建议使用)

[root@loadserver nginxlogs]$ ifconfig eth0 | awk -F "[ :]+" '/inet /{print $4}'
172.17.173.28

2,循环打印所有网络设备的ip

[root@blog nginxlogs]$ for dev in $(awk -F : '{if(NR>2)print $1}' /proc/net/dev);do printf '%+10s: ' $dev;echo $(ip addr show $dev | awk -F "[ /]+" '/inet /{print $3}'); done;
eth0: 172.17.165.21
lo: 127.0.0.1

3,打印当前网络的连接状态:

说明:netstat命令已停止更新,不建议使用

[root@loadserver nginxlogs]$ netstat -an|awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}'
TIME_WAIT 122
CLOSE_WAIT 1
FIN_WAIT2 7
ESTABLISHED 124
SYN_RECV 1
LISTEN 30

建议大家应该使用效率更高的ss命令

#-t :表示只显示 TCP 套接字

#-n:表示显示数字地址和端口(而不是名字)

#-a:display all sockets

[root@loadserver nginxlogs]$ ss  -tan|awk 'NR>1{++S[$1]}END{for (a in S) print a,S[a]}'
SYN-RECV 1
ESTAB 109
FIN-WAIT-2 7
TIME-WAIT 135
LISTEN 30

补充:直接使用ss的统计功能也可以

[root@loadserver nginxlogs]$ ss -s
Total: 249 (kernel 341)
TCP: 217 (estab 106, closed 75, orphaned 6, synrecv 0, timewait 75/0), ports 280
Transport Total IP IPv6
* 341 - -
RAW 0 0 0
UDP 12 12 0
TCP 142 142 0
INET 154 154 0
FRAG 0 0 0

​八,awk应用例子之五:安全:

1,统计所有登录失败的ip的失败次数

[root@loadserver ~]# grep "Failed" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c 

说明:也可以用lastb查看登录失败的情况

#sed '2,$d':删除最后的两行,一行是空行,一行是btmp的信息

[root@loadserver ~]# lastb | sed '2,$d' |  awk '{ print $3}' | sort | uniq -c | sort -nr
1 101.200.12.118

2,列出所有用密码成功登录的用户和ip

[root@loadserver ~]#  grep "Accepted password" /var/log/secure | awk '{print $(NF-5),$(NF-3)}'

3,列出所有用密钥成功登录的用户和ip

[root@blog ~]# grep "Accepted publickey" /var/log/secure | awk '{print $(NF-7),$(NF-5)}'

4,列出所有成功登录过的ip

[root@blog ~]# grep Accepted /var/log/secure | awk '{print $11}' | sort | uniq 

九,查看nginx版本

[root@blog ~]# cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core)

linux(centos8):awk在系统运维中的常用例子的更多相关文章

  1. linux运维中的命令梳理(一)

    在linux日常运维中,我们平时会用到很多常规的操作命令. 下面对常用命令进行梳理: 命令行日常系快捷键(不分大小写)CTRL + A 移动光标到行首CTRL + E 移动光标到行末CTRL + U ...

  2. Linux系统运维工程该具备哪些素质

    记得在上高中时,物理老师总是会对我们一句话:"学习是件苦差事."工作后发现,其实做运维也是件苦差事.最为一名运维工程师,深知这一行的艰辛,但和IT行业其他职务一样,那就是付出的越多 ...

  3. 浅谈Linux系统运维工程师必备技能

    一.什么是运维工程师 相信读者们必定听说过Linux,也听说过运维工程师.那么运维工程师是个什么概念呢? 百度百科上的官方解释如下: 运维工程师(Operations)在国内又称为运维开发工程师(De ...

  4. Linux系统运维笔记(五),CentOS 6.4安装java程序

    Linux系统运维笔记(五),CentOS 6.4安装java程序 用eclipse编译通的java程序,现需要实施到服务器.实施步骤: 一,导出程序成jar包. 1,在主类编辑界面点右健,选  ru ...

  5. Linux系统运维笔记(四),CentOS 6.4安装Nginx

    Linux系统运维笔记(四),CentOS 6.4安装Nginx 1,安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c++ libtool op ...

  6. Linux系统运维相关的面试题 (问答题)

    这里给大家整理了一些Linux系统运维相关的面试题,有些问题没有标准答案,希望要去参加Linux运维面试的朋友,可以先思考下这些问题.   一.Linux操作系统知识 1.常见的Linux发行版本都有 ...

  7. 7.学完linux系统运维到底可以做什么?

    linux运维到底可以做什么?(略有改动原文.排版) 运维,很容易从字面理解为运营.维护. 很多朋友认为,在互联网公司中linux系统运维的工作就是安装系统,部署服务.处理紧急故障,为公司里的开发人员 ...

  8. Linux系统运维笔记(四),CentOS 6.4安装 MongoDB

    Linux系统运维笔记(四),CentOS 6.4安装 MongoDB 1,下载 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6 ...

  9. Linux系统运维笔记(三),设置IP和DNS

    Linux系统运维笔记(三),设置IP和DNS 手工配置静态的IP地址 也就是手工配置IP地址.子网掩码.网关和DNS. vi /etc/sysconfig/network-scripts/ifcfg ...

随机推荐

  1. Javaweb应用中配置错误跳转页面

    关于在Javaweb应用中配置错误跳转页面 应用场景,比如服务器的出现404错误,我们想让它返回跳转到我们自定义的错误页面 解决方法: 主要在web.xml文件中进行配置,这里玩的错误页面都单独放在e ...

  2. Python3 学习笔记之 运算符

  3. 【LeetCode/LintCode】丨Google面试题:N皇后问题

    n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击(任意两个皇后不能位于同一行,同一列,同一斜线). 给定一个整数n,返回所有不同的n皇后问题的解决方案. 每个解决方案包含一个明确的 ...

  4. 用华为HMS ML kit人体骨骼识别技术,Android快速实现人体姿势动作抓拍&nbsp;

      你有没有过这种体验,拍照时对着镜头,脑子一片空白.表情僵硬.手和脚无处安放,最后拍出来的照片很是奇怪.拍照软件中的固定姿势抓拍功能可以帮助你:选择一个你想要的姿势模板,当你摆出同款姿势时,软件会进 ...

  5. archaius(1) 概述

    archaius作为配置管理工具,内部主要定义了下几个模块: 配置源 配置源的主要功能是将配置从目标位置加载到内存中.详见:archaius源码分析之配置源 配置管理器 配置管理器的主要功能是管理内存 ...

  6. 快速上手spring

    一.初始程序 1.在父类pom导入所需要的jar包 2.编写一个实体类 3.创建一个beans.xml,创建一个bean即创建一个user对象,可在bean内配置property即设置属性值 4.用测 ...

  7. Spring Cloud各组件学习

    Spring-Cloud 介绍 SpringCloud各个组件详解,因为SpringCloud部分组件停止更新,故本项目包含原SpringCloud(基于SpringCloud H版和SpringBo ...

  8. ==、equals()、hashcode()的关系和区别

    ==.equals().hashcode()概念 ==:它的作用是判断两个对象的地址是不是相等.即,判断两个对象是不试同一个对象. equals():它的作用也是判断两个对象是否相等.但它一般有两种使 ...

  9. 微服务电商项目发布重大更新,打造Spring Cloud最佳实践!

    Spring Cloud实战电商项目mall-swarm地址:转发+关注 私信我获取地址 系统架构图   系统架构图 项目组织结构 mall├── mall-common-- 工具类及通用代码模块├─ ...

  10. 【FastDFS】SpringBoot整合FastDFS实战,我只看这一篇!!

    写在前面 在<[FastDFS]小伙伴们说在CentOS 8服务器上搭建FastDFS环境总报错?>和<[FastDFS]面试官:如何实现文件的大规模分布式存储?(全程实战)> ...