Linux - awk命令详解

article/2025/9/16 22:06:15

目录

1.  awk命令

1.1  awk工作原理

1.2  awk语法

1.2.1  awk完整语法

示例:

1.2.1  awk工作流程

1.3  指定分隔符

1.3.1  -F 指定分隔符

1.3.2  指定输出分隔符

2.  free命令

2.1  free命令各项含义 

 2.1.1  什么时候会使用交换分区?

2.1.2  内核参数优化

2.2   常用选项

-m 以M为单位显示内存的使用情况

-h  以人类能读懂的格式显示

3.0  awk各种组合运用

3.1   awk进行计算

3.2   awk命令的引用shell变量 

3.3  awk内置函数

  length()函数

 substr()函数

3.4  awk的if和for循环

3.5 awk里的数组


1.  awk命令

awk: gawk - pattern scanning and processing language

1.1  awk工作原理

与sed一样,均是一行一行的读取,处理

sed作用于一整行的处理,而awk将一行分成数个字段来处理

字段:一段字符串 --》一段很多字符组成了一个字符串

#############################################

1.2  awk语法

1.2.1  awk完整语法

awk ‘BEGIN {commands} pattern {commands}END{commands}' file1

BEGIN:处理数据前执行的命令

END:处理数据后执行的命令

pattern:模式,每一行都执行的命令

BEGIN和END里的命令只是执行一次

pattern里的命令会匹配每一行去处理

示例:

[root@localhost lianxi]# cat /etc/passwd|awk -F ":" 'BEGIN{print "###start###"} $3>500&&$3<2000 {print $1,$3}END{print "###end###"}' 
###start###
polkitd 999
chrony 998
xiaowang 1000
chenhang 1001
zhnagjian 1002
zhangjian 1003
wangshenghu 1004
yalin 1005
nginx 997
lilanqing 1006
califeng 1007
cali123 1008
shimengmeng 1010
zhouyiwei 1011
zhaojunjie 1013
kimi 1014
kimi2 996
linhucong 1015
kimi3 1016
feng2 1018
feng3 1019
feng4 1020
feng5 1021
liudehua 1022
liming 1023
libai 1024
xiaoxiao 1025
xiyangyang 1026
meiyangyang 1027
lanyangyang 1028
zhangwuji 1029
liang 1030
###end###

awk -F ":" '{print $1,$2,$5}' /etc/passwd | head -5

[root@localhost 7.4]# awk -F ":" '{print $1,$2,$5}' /etc/passwd | head -5
root x root
bin x bin
daemon x daemon
adm x adm
lp x lp

-F ":"  :  awk选项,指定输入分割符为:,

'{print}'    : 固定语法

$1,$2,$5  :输出第一个,第二个,第五个字段

 ,  : 是输出分隔符,如果不加默认是没有分隔符的。

[root@localhost 7.4]# awk -F ":" '{print $1$2$5}' /etc/passwd | head -5
rootxroot
binxbin
daemonxdaemon
admxadm
lpxlp

############################################# 

1.2.1  awk工作流程

执行BEGIN{commands}语句块中的语句

从文件或stdin中读取第一行,看有无模式匹配,若无则执行{}中的语句

若有则检查该整行与pattern是否匹配,若匹配,则执行{}中的语句

若不匹配则不执行{}中的语句,接着读取下一行

重复这个过程,知道所有行被读取完毕

执行END{commands语句块中的语句}

BEGIN 和 END 部分只是执行一次

中间部分每一行都执行一次

 

#############################################

1.3  指定分隔符

1.3.1  -F 指定分隔符

awk默认分隔符为空白:

示例:

[root@localhost 7.1]# cat grade.txt | awk '{print $2,$3,$4}'
name chinese english
cali 80 80
tom 90 90
jarry 70 100

分隔符不是空白时候可以使用-F选项来指定分隔符

[root@localhost 7.1]# cat /etc/passwd | tail | awk -F ":" '{print $1,$3,$4}'
sanle 9931 9932
test 9932 9935
wang 9933 9933
zhao 9934 9934
bobo 9935 9936
hang 9936 9937
mysql 27 27
bailongma 9937 9938
baigujing 9938 9939
yutujing 9939 9940

############################################# 

1.3.2  指定输出分隔符

 使用OFS定义输出分隔符

OFS="@@" 指定输出分隔符为@@

[root@localhost 7.6]# awk -F ":" 'OFS="@@"{print $1,$7}' passwd 
mysql@@/sbin/nologin
bailongma@@/bin/bash
baigujing@@/bin/bash
yutujing@@/bin/bash
rrrge@@/bin/bash

############################################# 

2.  free命令

free查看内存使用的命令

[root@localhost 7.5]# free -mtotal        used        free      shared  buff/cache   available
Mem:            972         212         418           7         341         607
Swap:          2047           0        2047

############################################# 

2.1  free命令各项含义 

 Mem :memory 内存

total : 是总的物理内存(内存条的大小)

used:使用了多2.11少内存

shared:共享内存消耗的空间   ---》进程和进程之间的通信方式

buff/cache    ---》buffer  cache  缓存

                        buffer :data from  memory  to  disk

                        cache: data from disk to memory

available : 可用的内存空间

                        一个新的进程他可以使用的内存空间 = free + buff和cache里的可用空间

swap(交换分区):从磁盘里划分出来的一块空间,用来当做内存使用,速度比较慢

                                    将不活跃的进程临时存放到交换分区,当物理内存不足时就会采用交换分区

############################################# 

 2.1.1  什么时候会使用交换分区?

内存消耗了70%时就会使用交换分区

依据:在/proc/sys/vm/swappiness 文件里面规定了这一指标

               如下:意思为当物理内存还有30%时采用交换分区

[root@localhost 7.5]# cat /proc/sys/vm/swappiness 
30

############################################# 

2.1.2  内核参数优化

内核参数优化,提升进程使用的效率,告诉系统尽可能多使用物理内存,物理内存速度快

[root@localhost 7.5]# cat /proc/sys/vm/swappiness 
30
[root@localhost 7.5]# echo 0  >/proc/sys/vm/swappiness 
[root@localhost 7.5]# cat /proc/sys/vm/swappiness 
0

 可以看到,当我们使用交换分区以后,可用内存增加了。

2.2   常用选项

-m 以M为单位显示内存的使用情况

-h  以人类能读懂的格式显示

############################################

3.0  awk各种组合运用

############################################# 

3.1   awk进行计算

例1:统计uid>1000并且使用shell是bash的用户的数量

[root@localhost 7.6]# awk -F ":" '$3>1000&&$7 ~ /bash/{print $1,$3,$7; i++}END{print "uid大于1000并且shell是bash的人数有:"i"人"}' passwd chenhang 1001 /bin/bash
zhnagjian 1002 /bin/bash
zhangjian 1003 /bin/bash
wangshenghu 1004 /bin/bash
yalin 1005 /bin/bash
lilanqing 1006 /bin/bash
califeng 1007 /bin/bash
cali123 1008 /bin/bash
shimengmeng 1010 /bin/bash
zhouyiwei 1011 /bin/bash
zhaojunjie 1013 /bin/bash
kimi 1014 /bin/bash
linhucong 1015 /bin/bash
kimi3 1016 /bin/bash
feng2 1018 /bin/bash
feng3 1019 /bin/bash
feng4 1020 /bin/bash
feng5 1021 /bin/bash
liudehua 1022 /bin/bash
liming 1023 /bin/bash
xiaoxiao 1025 /bin/bash
xiyangyang 1026 /bin/bash
meiyangyang 1027 /bin/bash
lanyangyang 1028 /bin/bash
zhangwuji 1029 /bin/bash
liang 1030 /bin/bash
user01 9901 /bin/bash
user02 9902 /bin/bash
user03 9903 /bin/bash
user04 9904 /bin/bash
user05 9905 /bin/bash
user06 9906 /bin/bash
user07 9907 /bin/bash
user08 9908 /bin/bash
user09 9909 /bin/bash
zhangheng 9921 /bin/bash
zhaomin 9922 /bin/bash
wuji 9923 /bin/bash
liangluyao 9924 /bin/bash
pingguo 9925 /bin/bash
jingshi 9926 /bin/bash
yueyang 9927 /bin/bash
tangpj 9928 /bin/bash
tangpz1 9929 /bin/bash
sc1 9930 /bin/bash
test 9932 /bin/bash
wang 9933 /bin/bash
zhao 9934 /bin/bash
bobo 9935 /bin/bash
hang 9936 /bin/bash
bailongma 9937 /bin/bash
baigujing 9938 /bin/bash
yutujing 9939 /bin/bash
rrrge 9940 /bin/bash
uid大于1000并且shell是bash的人数有:54人

例2:显示第5行到第10行/etc/passed文件里的第3和第5字段的内容

[root@localhost 7.6]# awk -F ":" 'NR>=5 && NR<=10{print NR,$3,$5}' passwd 
5 4 lp
6 5 sync
7 6 shutdown
8 7 halt
9 8 mail
10 11 operator

############################################# 

3.2   awk命令的引用shell变量 

在awk里面使用已经定义好的变量要用双引号括起来,并且条件匹配注意转义。

字段求和

 

#############################################

3.3  awk内置函数

  length()函数

 统计没有设置密码的用户的数量以及用户名

bobo
hang
mysql
bailongma
baigujing
yutujing
rrrge
mengmeng1
mengmeng2
mengmeng3
没有设置密码的用户有87个

 substr()函数

类似于python的切片处理

例:输出使用shell是bash的用户的第7个字段的前4个字符,并输出用户名

 

例:输出密码字段长度小于2并且输出用户名字段的前2个字符,统计个数输出出来。

[root@localhost 7.6]# awk -F : 'length($2)<=2 {print substr($1,1,2);num++}END{print num}' passwd
ro
bi
da
ad
lp
ha
my
ba
ba
yu
rr
me
me
me
87

############################################# 

3.4  awk的if和for循环

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

 示例:使用awk命令来输出passwd文件里哪些是超级用户,系统用户,普通用户。

 

[root@localhost 7.5]# awk -F ":" '{if($3 ==0 ) print $1"是超级用户";else if($3>1&&$3<=999) print $1"是系统用户"; else print $1"是普通用户"}' passwd 
root是超级用户
bin是普通用户
daemon是系统用户
adm是系统用户
lp是系统用户
sync是系统用户
shutdown是系统用户
halt是系统用户
mail是系统用户
operator是系统用户
games是系统用户
ftp是系统用户
nobody是系统用户
systemd-network是系统用户
dbus是系统用户
polkitd是系统用户
sshd是系统用户
postfix是系统用户
mysql是系统用户
bailongma是普通用户
baigujing是普通用户
yutujing是普通用户

例:使用awk命令来输出passwd文件里哪些是超级用户,系统用户,普通用户。并输出各用户的个数。

[root@localhost 7.6]# awk -F : '{if($3 == 0){print $1"是超级用户";num1++;}else if($3>1 && $3 <1000){print $1"是系统用户";num2++;}else{print $1 "是普通用户";num3++;}}END{print"超级用户有:"num1"系统用户有:"num2"普通用户有:"num3}' passwd 
root是超级用户
bin是普通用户
daemon是系统用户
adm是系统用户
lp是系统用户
sync是系统用户
shutdown是系统用户
halt是系统用户
mail是系统用户
operator是系统用户
games是系统用户
tcpdump是系统用户
sanle是普通用户
test是普通用户
wang是普通用户
zhao是普通用户
bobo是普通用户
hang是普通用户
mysql是系统用户
bailongma是普通用户
baigujing是普通用户
yutujing是普通用户
rrrge是普通用户
mengmeng1是普通用户
mengmeng2是普通用户
mengmeng3是普通用户
超级用户有:1系统用户有:23普通用户有:63

############################################# 

3.5 awk里的数组

例:统计每个省份一共得到了多少票

[root@localhost 7.6]# awk '{vote[$1]+=$3}END{for (i in vote) print i,vote[i]}' lianxi.txt | sort -n -k 2
河南 6
江西 9
山东 12
湖南 43

练习题:

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

61.147.15.67 112345678
 

答案示例:

[root@localhost 7.6]# awk '{access[$1]+=$10}END{for (i in access) print i,access[i]}' access.log |sort -k 2 -nr|head -100

以下是一段nginx服务的日志:

[root@localhost 7.6]# cat nginx.log 
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|-|-
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.计算每分钟的带宽

方法1:

[root@localhost 7.6]# awk -F "|" '{print substr($1,1,16),$6}' nginx.log 
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

方法2:

[root@localhost 7.6]# awk -F "|" '{bandwidth[(substr($1,1,16))]+=$6}END{for (i in bandwidth) print i,bandwidth[i]}' nginx.log 
2019-04-25T10:01 110
2019-04-25T09:56 24
2019-04-25T09:57 397
2019-04-25T09:58 404
2019-04-25T09:59 6644
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


http://chatgpt.dhexx.cn/article/naYuY43j.shtml

相关文章

awk 命令详解

目录 一、awk概述 二、awk 工具原理 三、awk内置变量 四、awk用法示例 1、awk常用内置变量 2、BEGIN、END的用法 3、模糊匹配 4、数值与字符串的比较 5、逻辑运算&&和|| 6、其他内置变量的用法 7、awk高级用法 定义引用变量 awk通过管道符号、双引号调用she…

如何选择适合你的项目管理认证

前言 越来越多的小伙伴开始去考项目管理认证&#xff0c;目前互联网行业内主流的项目管理认证还是PMP的认证。 我想从几个方面来深度讲一讲项目管理认证的内容和价值&#xff0c;帮助大家做一个选择和辨别&#xff0c;避免在众多的项目管理认证中迷失了方向&#xff0c;一不小…

【敏捷方法落地之旅】-PMI_ACP敏捷认证交流会

会议名称&#xff1a;PMI_ACP敏捷认证交流会 会议时间&#xff1a;3月26日(星期六)14:00-16:30 会议举办具体地址&#xff1a;黄浦区成都北路500号峻岭广场16楼 票价&#xff1a;免费 参会规模(人数)&#xff1a;50 会议主办方&#xff1a;光环国际 一、会议简介 项目管…

CSM(Certified Scrum Master) 敏捷认证是什么?

Scrum 是用于开发和持续支持复杂产品的一个框架。Scrum 基于试验性过程控制理论&#xff0c;借鉴了精益思想、时间盒、模块化设计等&#xff0c;并完整地体现了敏捷宣言和敏捷原则。Scrum 采用一种迭代、增量式的方法来优化对未来的预测和管理风险&#xff0c;建立组织响应变化…

权威的国际敏捷认证Certified Scrum Master (CSM)

权威的国际敏捷认证Certified Scrum Master (CSM) A. 认证前 在学习Certified Scrum Master (CSM)之前,你需要了解: 什么是CSMCSM认证与其他敏捷认证有什么区别常见问题CSM培训课程大纲1. 什么是CSM 什么是Certified Scrum Master (CSM)2. Scrum国际敏捷认证 敏捷认证的对比…

PMI-ACP敏捷认证:敏捷开发的6个实战经验

敏捷开发,相对传统软件开发模式,它主要是针对快速变化的需求,不断优化管理流程,最终推出优质软件。 1. 快速迭代 相对那种半年一次的大版本发布来说,小版本的需求、开发和测试更加简单快速。一些公司,一年仅发布仅2~3 个版本,发布流程缓慢,它们仍采用瀑布开发模式,更严…

2021PMI-ACP®国际敏捷项目管理师认证招生简章

敏捷管理专业人士&#xff08;PMI-ACP&#xff09;认证要求敏捷培训、敏捷项目工作经验以及包含敏捷实践、工具、技巧考试的结合&#xff0c;结合了其他敏捷方法&#xff0c;包括SCRUM&#xff08;敏捷开发&#xff09;&#xff0c;XP&#xff08;极限编程&#xff09;和Lean D…

Scrum master敏捷认证全真试题截图PDF CSM敏捷认证考题真题题目试题2022年试题和答案下载

Scrum master敏捷认证全真试题截图PDF CSM敏捷认证考题真题题目试题2022年试题和答案下载 一、CSM敏捷认证简介 更多的介绍大家可以自行去百度搜索了解一下。 市面上的敏捷认证有两个&#xff1a; 一个是PMI的PMI-ACP认证&#xff1b; 一个是Scrum联盟的Certificated Scrum…

记一次CRM敏捷认证培训学习总结

前言 最近公司组织了一次关于CRM敏捷认证的培训和考试活动。为了加深记忆和留待以后回顾复习&#xff0c;也为了想要了解敏捷的同学提供一定的帮助&#xff0c;特此写了一篇关于敏捷培训的总结。 学习链接&#xff1a; Scrum指南2020版本下载地址&#xff1a;https://scrumgui…

敏捷认证_新敏捷–认证

敏捷认证 上次我们看情况如何。 事情如何在滑雪胜地的一群软件开发人员之间汇聚&#xff1a;在该领域进行了实际实验&#xff0c;并取得了成功。 有一个沟通渠道可以传播这些想法。 现在有了共同的愿景和名字。 除非肯施瓦伯 &#xff08; Ken Schwaber &#xff09;具有精明的…

C语言之#include用法详解

学习Linux C&#xff0c;必须要理解include&#xff0c;只要弄清以下几个问题&#xff0c;就能完全理解include了&#xff01; 1.#include 实质是什么&#xff1f; 预编译的时候copy include头文件的内容到当前行 &#xff08;疑问&#xff1a;预编译命令 $gcc -E test.c -o …

CMake中include的使用

CMake中的include命令用于从文件或模块(file or module)加载并运行CMake code。其格式如下&#xff1a; include(<file|module> [OPTIONAL] [RESULT_VARIABLE <var>][NO_POLICY_SCOPE]) 从给定的文件加载并运行CMake code。变量读写访问调用者的范围(Variable rea…

Makefile基础教学(include的使用方法)

文章目录 前言一、include在makefile中的概念介绍二、include使用示例三、include中需要注意的一些操作1. 在include前加-选项2. include触发规则创建了文件会发生什么3. include包含的文件夹存在 总结 前言 本篇文章将讲解include的使用方法&#xff0c;在C语言中使用include…

django urls include用法

在Django框架中&#xff0c;提供了非常清晰简洁的url管理方法&#xff0c;在新建一个project之后(此处为myproject),然后在项目中建立一个app(此处为myapp)&#xff0c;会看到有如下的目录结构&#xff1a; 一般所熟知的就是在myproject/myproject/urls.py中的urlpatterns列表中…

#include的使用方法

include的作用&#xff1a; #include叫做“文件包含” / include 语句包含并运行指定文件。 功能&#xff1a;它的功能是用来指定文件的全部内容替换程序中的命令行&#xff0c;从而使指定的文件与当前源文件连成一个源文件 书写格式&#xff1a; #include <文件名> …

移位密码及其python实现

就当为CSDN这方面的python开源做点贡献哈哈哈 移位密码 算法原理 ​ python代码 #移位密码 class ShiftCipher:global dddict(zip(.join(chr(i) for i in range(97,123)),list(range(0,26))))#字母表def __init__(self,k:int):self.kk;#k为移位数def encrypt(self,m:str):#加…

python编写移位密码实现加密与解密

python编写移位密码实现加密与解密 移位密码 参考代码&#xff0c;通过列表和ASCII实现&#xff1a; def encrypt(s,key):l list(s);l1 list();for i in l:if i.isalpha():k (ord(i) - 97 key) % 26 97;l1.append(chr(k));else:l1.append(i);s1 .join(l1)print(encrypte…

C++移位密码

C移位密码 这里/**移位密码*/ #include C移位密码欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建…

CTF-密码学-位移密码

题目&#xff1a;位移密码 一步之遥 读题&#xff1a;小明说b3W6f3FzOHKkZ3KiN{B5NkSmZXJ5[ERxNUZ5Z3ZyZ{Gn[kWigR>> 说完&#xff0c;然后他就以64m每秒的速度溜了。 flag格式为SeBaFi{xxx} 审题&#xff1a;考察移位密码&#xff0c;题目提示64m/s的速度&#xff0c;联…