linux之awk详解

article/2025/9/16 22:27:01

前言

awk不仅仅是Linux系统中的一个命令,而且其还是一种编程语言,可以用来处理数据和生成报告(Excel)。处理的数据可以是一个或多个文件,它是Linux系统最强大的文本处理工具,没有之一。

【语法格式】

awk [option] ‘pattern{action}’ file …
awk [参数] ‘条件{动作}’ 文件 …

awk命令的常用功能

在这里插入图片描述
awk命令的参数选项及说明
在这里插入图片描述

案例1 :显示文件中的第5行

测试文件及内容如下:

#查看测试文件并每行编号
bash-5.0# cat -n reload.sh 1  echo "loading..."2  # pid=`pidof skeleton.Master`3  # kill -HUP $pid4  pid=`ps -ef |grep skeleton.Worker| grep -v grep| awk '{print $1}'`5  # | xargs kill -USR16  echo $pid7  kill -9 $pid8  # kill -USR1 $pid9  echo "loading success"
bash-5.0# awk "NR==5" reload.sh 
# | xargs kill -USR1 		 #<==和上面内容对比确实是第5行

说明:

首先NR在awk中表示行号(记录号),NR==5表示行号等于5的行。这里需要注意的是必须使用两个等号,在awk中两个等号表示“等于”,一个等号表示赋值,即向一个变量里面放置内容。注意:awk后面所接的内容要用单引号。
命令拓展:显示一部分行的内容,例如显示2-5行。

bash-5.0# awk "NR==2,NR==5" reload.sh
# pid=`pidof skeleton.Master`
# kill -HUP $pid
pid=`ps -ef |grep skeleton.Worker| grep -v grep| awk '{print $1}'`
# | xargs kill -USR1

案例2:给文件每行的内容之前加上行号。

bash-5.0# awk '{print NR,$0}' reload.sh 1 echo "loading..."2 # pid=`pidof skeleton.Master`3 # kill -HUP $pid4 pid=`ps -ef |grep skeleton.Worker| grep -v grep| awk '{print $1}'`5 # | xargs kill -USR16 echo $pid7 kill -9 $pid8 # kill -USR1 $pid9 echo "loading success"

说明:

这里的NR还是表示行号,$0表示一整行的内容(一行的内容)。print关键字表示显示的内容,相当于是awk内部的一个命令。那么print命令为何要放在花括号中呢?因为这个命令(动作)是“很害羞”的,需要“城墙”保护(花括号)。

案例3:显示文件的第2行到6行,并打印行号。

bash-5.0# awk 'NR==2,NR==5 {print NR,$0}' reload.sh 		#<==注意位置和写法。2 # pid=`pidof skeleton.Master`3 # kill -HUP $pid4 pid=`ps -ef |grep skeleton.Worker| grep -v grep| awk '{print $1}'`5 # | xargs kill -USR1

案例4:获取此文件的第1列和第三列、最后一列

bash-5.0# cat 1.txt 
qq:ww:ee:rr:ss:22:3333:221
zz:xxx:sss:ddd:aaa:f
w:e:r:q:f:g:ghh:h:f:f:f:f
qq:ww:ee:rr:ss:22:3333:221
w:e:r:q:f:g:ghh:h:f:f:f:f
qq:ww:ee:rr:ss:22:3333:221
zz:xxx:sss:ddd:aaa:f
qq:ww:ee:rr:ss:22:3333:221
bash-5.0# awk -F ':' '{print $1,$3,$NF}' 1.txt
qq ee 221
zz sss f
w r f
qq ee 221
w r f
qq ee 221
zz sss f
qq ee 221
说明:
  • 这里我们使用了awk的-F参数,注意一定要是大写的,-F参数表示指定分隔符来切割每一行的内容,-F后面可用单双引号或不加引号,但是,建议加双引号。

  • 这里我们指定的分隔符是冒号“:”,这样该行就被不同的冒号切割成了很多个部分。

  • 切成了很多个部分之后,若我们要使用某一个部分该怎么办?使用“$(美元符号)”后面接数字,$1表示第一个部分(第一列),$2(第二列),$3(第三列),依此类推,但$0表示整行。

  • 这里有一个特殊的表示最后一列的方法,就通过$NF来表示最后一列。

案例5:使用awk将文件中的qq替换为tihuan(使用awk函数实现)

bash-5.0# awk '{gsub("qq","tihuan",$0);print $0}' 1.txt
tihuan:ww:ee:rr:ss:22:3333:221
zz:xxx:sss:ddd:aaa:f
w:e:r:q:f:g:ghh:h:f:f:f:f
tihuan:ww:ee:rr:ss:22:3333:221
w:e:r:q:f:g:ghh:h:f:f:f:f
tihuan:ww:ee:rr:ss:22:3333:221
zz:xxx:sss:ddd:aaa:f
tihuan:ww:ee:rr:ss:22:3333:221

这里使用的是awk里面的查找替换功能,即gsub函数。
gsub的格式如下:

gsub(“替换对象”,“替换成什么内容”,哪一列)

注意:

  • gsub与后面的括号之间不能有空格。
  • 替换对象、替换成什么内容以及哪一列之间要用逗号分隔开。
  • 替换对象的外面要有双引号或双斜线包裹起来,即“替换对象”或/替换对象/。
  • 替换成什么内容就只能用双引号包裹起来了,即“替换成什么内容”。
  • 最后一个是哪一列,这个是可以省略的,省略的时候表示要替换整行的内容,相当于是写上了$0。

案例6:取出eth0网卡对应的ip地址。

本地机器的ip信息如下

bash-5.0# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02  inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:26 errors:0 dropped:0 overruns:0 frame:0TX packets:5 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0RX bytes:1968 (1.9 KiB)  TX bytes:246 (246.0 B)

本例的方法特别多,这里仅使用awk给出常见的实现。

方法1

bash-5.0# ifconfig eth0 |awk -F "(addr:)|(  Bcast:)" 'NR==2{print $2}'
172.17.0.2
说明:

-F"(addr:)|(Bcast:)"这个还是比较容易理解的,我们的目标是取得ip,本例是10.0.0.8,ip的左边是“addr:”,右边是“Bcast:”,左边分隔,即把“addr:”作为分隔符,右边分隔,即把“Bcast:”作为分隔符,剩下中间的ip就是我们想要的。
但是还需要一个条件,ip地址在第二行所以使用NR==2来表示。

方法2

bash-5.0# ifconfig eth0|awk -F "[ :]+"  'NR==2{print $4}'
172.17.0.2

在这里插入图片描述

说明:

172.17.0.2的左边挨着的是冒号,因此可以用冒号作为分隔符,即-F":“。
172.17.0.2的右边挨着的是空格,因此可以用空格作为分隔符,即-F”“。
但是行的最左边是多个空格又该怎么处理呢?
很简单,可以用正则表达式的加号(+),表示重复前面一个字符一次或一次以上。
结合起来就是,-F”[:]+"以单个或连续的空格或冒号或者它们的组合为分隔符,最后就可以获得我们想要的ip地址。

案例7:将域名取出并根据域名进行计数排序处理(百度和搜狐面试题):

bash-5.0# cat domainTest.txt
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.取出域名

bash-5.0# awk -F '/' '{print $3}' domainTest.txt
www.etiantian.org
www.etiantian.org
post.etiantian.org
mp3.etiantian.org
www.etiantian.org
post.etiantian.org

2.排序

bash-5.0# awk -F '/' '{print $3}' domainTest.txt | sort
mp3.etiantian.org
post.etiantian.org
post.etiantian.org
www.etiantian.org
www.etiantian.org
www.etiantian.org

3.去重计数

 awk -F '/' '{print $3}' domainTest.txt | sort | uniq -c1 mp3.etiantian.org2 post.etiantian.org3 www.etiantian.org

http://chatgpt.dhexx.cn/article/2OPGfpJc.shtml

相关文章

Linux - awk命令详解

目录 1. awk命令 1.1 awk工作原理 1.2 awk语法 1.2.1 awk完整语法 示例&#xff1a; 1.2.1 awk工作流程 1.3 指定分隔符 1.3.1 -F 指定分隔符 1.3.2 指定输出分隔符 2. free命令 2.1 free命令各项含义 2.1.1 什么时候会使用交换分区&#xff1f; 2.1.2…

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 创建…