一,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. 为什么互联网巨头们纷纷使用Git而放弃SVN?(内含Git核心命令与原理总结)

    写在前面 最近发现很多小伙伴对于工作中的一些基本工具的使用还不是很了解,比如:Git这个分布式的代码管理仓库,很多小伙伴就不是很了解,或者说不是很熟悉.甚至有些小伙伴都没听说过Git,就只会用个SVN ...

  2. C enum(枚举)

    C enum(枚举) 枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读. 枚举语法定义格式为: enum 枚举名 {枚举元素1,枚举元素2,……}; 接下来我们举个例子,比如:一星期有 ...

  3. oracle之时间类型

    Oracle 时间类型及Timezone 20.1 Oracle的六种时间类型 DATETIMESTAMPTIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TI ...

  4. UI中列表

    1.ul.ol.dl

  5. 再不迁移到Material Design Components 就out啦

    翻译自国外文档加自己理解 原文 我们最近宣布了 Material Design Components(MDC)1.1.0 ,这是一个库更新,为您的 Android 应用程序带来了 Material T ...

  6. 对比ERP解读企业资产管理EAM在电力行业应用

    对比ERP解读企业资产管理EAM在电力行业应用 .关于EAMEAM (Enterprise Asset Management)企业资产管理,是面向固定资产占企业资产主要部分的资产密集型(Capital ...

  7. 1.3Hadoop版本说明

  8. pytest自学第二期

    2.1 通过python解释器调用 pytest 我不知道有什么用:-) 以后就这样,如果有自己学过但是不知道的东西,就挂在那里晒着鞭尸,一直不会就一直鞭尸,直到自己参透了其中的道理再回到这里补全 在 ...

  9. jfinal3连接sqlserver2012 使用generator生成model 将smallint默认为string

    修改MetaBuilder的buildColumnMetas方法增加对smallint的判断

  10. 2020 CiGA Game Jam活动总结

    CiGA Game Jam 总结 今年8月14.15.16号,48小时游戏开发--Game Jam开始了.蠢新第一次参加Game Jam,今年还是线上开展,情绪复杂= = 还有一个坏消息,晓航旅游缺席 ...