shell-awk文本处理工具

1、awk概述

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具
它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作
数据可以来自标准输入也可以是管道或文件
linux 上常用的是 gawk,awk gawk 的链接文件
[root@localhost~]# which awk
/usr/bin/awk
[root@localhost~]# ll /usr/bin/awk
lrwxrwxrwx. 1 root root 4 6月  11 07:19 /usr/bin/awk -> gawk

2、awk工作原理

当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出
如果没有定义匹配条件默认是匹配所有数据行, awk 隐含循环,条件匹配多少次动作就会执行多少次逐行读取文本,默认以空格或tab 键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
sed 命令常用于一整行的处理,而 awk 比较、倾向于将一行分成多个 "" 字段 " 然后再进行处理。 awk
信息的读入也是逐行读取的,执行结果可以通过 print 的功能将字段数据打印显示。在使用 awk 命令的过程中, 可以使用逻辑操作符 " &&" 表示 " " "|| 表示 " " "!" 表示非 "; 还可以进行简单的数学运算,如 +、- 、* / % ^ 分别表示加、减、乘、除、取余和乘方。
正则表达式 : /root/ 匹配含有 root 的行 /*.root/
关系表达式: < > && || + *
匹配表达式: ~ ~ 动作:
变量 命令 内置函数 流控制语句它的语法结构如下:
awk [options] 'BEGIN{ print "start" } ‘pattern{ commands }’ END{ print "end" }'
BEGIN END AWK 的关键字部,因此必须大写;这两个部分开始块和结束块是可选的

3、awk执行流程

BEGIN 语句设置计数和打印头部信息,在任何动作之前进行
END 语句输出统计结果,在完成动作之后执行
AWK 执行流程:读( Read )、执行( Execute )与重复( Repeat
1 Read ):从文件、管道或标准输入中读入一行到内存中
2 执行 Execute ):对每一行数据,根据 AWK 命令按顺序执行。默认情况是处理每一行数据,也可以指定模式
3 重复 Repeat ):一直重复上述两个过程直到文件结束

4、命令格式

awk 选项 ' 模式或条件 { 操作 }' 文件 1 文件 2 ...
awk -f 脚本文件 文件 1 文件 2 ..
格式: awk 关键字 选项 命令部分 '{xxxx}' 文件名
**AWK 支持两种不同类型的变量:内建变量 ( 可直接使用 ) ,自定义变量 awk 内置变量(预定义变量)
FS :指定每行文本的字段分隔符,默认为空格或制表位。
NF :当前处理的行的字段个数。在执行过程中对应于当前的字段数, NF :列的个数
NR :当前处理的行的行号(序数)。 在执行过程中对应于当前的行号
$0 :当前处理的行的整行内容。
$n :当前处理行的第 n 个字段(第 n 列)。比如 : $1 表示第一个字段, $2 表示第二个字段
FILENAME :被处理的文件名 ( 当前输入文件的名 )
FNR 各文件分别计数的行号
OFS 输出字段分隔符(默认值是一个空格)
ORS 输出记录分隔符(默认值是一个换行符)
RS: 行分隔符。 awk 从文件上读取资料时 , 将根据 Rs 的定义把资料切割成许多条记录 , awk 一次仅读入一条记录, 以进行处理。预设值是 " \n'
简说:数据记录分隔,默认为 \n ,即每行为一条记录

5、内建变量

awk 包含几个特殊的内建变量(可直接用)如下所示:
FS :指定每行文本的字段分隔符,默认为空格或制表位(\t)。
NF :当前处理的行的字段个数()。
NR :当前处理的行的行号(序数)。
$0 :当前处理的行的整行内容
$n :当前处理行的 n 个字段(第 n 列)
FILENAME :被处理的文件名。
RS: 行分隔符。 awk 从文件上读取资料时 , 将根据 Rs 的定义把资料切割成许多条记录 , awk 一次仅读入一
条记录 , 以进行处理。预设值是 " \n'
简说:数据记录分隔,默认为 \n ,即每行为一条记录
[root@localhost ~] #awk 'patterm{action}'
[root@localhost ~] #awk ' '                # 什么都不写 空没有效果
[root@localhost ~] #awk '{print}'              #把输入内容再 打印一遍
[root@localhost ~] #awk '{print "hello"}'                     输入任何内容都打印hello
# 字符串需要添加双引号,单引号已被使用
[root@localhost ~] #awk '{print "hello"}' < /etc/passwd         
把/etc/passwd内容输出到awk,所有/etc/passwd内容显示成hello
[root@localhost ~] # cat /etc/passwd | head -10 > zz            #把/etc/passwd前10行输入到zz
[root@localhost ~] # awk '{print}' zz                     #打印文件zz
[root@localhost ~] # awk  '{print $1}' zz           #以默认空格为分隔,打印zz第一列
[root@localhost ~] # awk -F: '{print $1}' zz           #以:为分隔,打印zz第一列
root:x:0:0:root:/root:/bin/bash //awk 默认把这一行当做一列,因为没有被空格分隔, awk
认以空格或 tab 键分隔
[root@localhost ~] # awk -F: '{print $5}' zz          # 以:为分隔符,打印第五列
[root@localhost ~] # awk -Fx '{print $1}' /etc/passwd          #以  为分隔符 ,打印第一列
[root@localhost ~] # awk '{print $1 $2}' zz
[root@localhost ~] # awk '{print $1" "$2}' zz           #双引号中间加一个空格,空格作用
[root@localhost ~] # awk '{print $1,$2}' zz              # 逗号有空格效果
[root@localhost ~] # awk -F: '{print $1"\t"$2}' /etc/passwd        #用制表符作为分隔符
[root@localhost ~] # awk -F[:/] '{print $9}' zz
// 定义多个分隔符,只要看到其中一个都算作分隔符

6、内置变量

awk 常用内置变量: $1 $2 NF NR $0
$1 :代表第一列
$2 :代表第二列以此类推
$0 :代表整行
NF:一行的列数
NR:行数
[root@localhost ~] # awk -F: '/root/{print $0}' zz               // 打印包含 root 的整行内容
[root@localhost ~] # awk -F: '/root/{print $1}' zz               // 打印包含 root 的行的第一列
[root@localhost ~] # awk -F: '/root/{print $1,$6}' zz           // 打印包含 root 行的第1列和第6列
[root@localhost ~] # awk '/root/' /etc/passwd                 //输出包含root的行
[root@localhost ~] # awk -F[:/] '{print NF}' zz               // 打印每一行的列数
[root@localhost ~] # awk '{print NR}' zz
[root@localhost ~] # awk -F[:/] '{print NR}' zz                            //显示行号
[root@localhost ~] # awk -F: '{print NR}' zz
[root@localhost ~] # awk -F: '{print NR,$0}' pass.txt         //显示行号,并打印每一行
[root@localhost ~] # awk 'NR==2' zz              //打印第二行  (不加 print 也一样,默认就是打印)
[root@localhost ~] # awk 'NR==2{print}' /etc/passwd 
[root@localhost ~] # awk  'NR==2{print $1}' /etc/passwd // 打印第二行的第一列
[root@localhost ~] # awk -F: '{print $NF}' /etc/passwd // 打印最后一列
[root@localhost ~] # awk 'END{print NR}' zz                 // 打印最后一行行号,相当于总行数
[root@localhost ~] # awk 'END{print $0}' zz               // 打印文件最后一行
[root@localhost ~] # awk -F: '{print " 当前行有 "NF" "}' zz
[root@localhost ~] # awk -F: '{print " "NR" 行有 "NF" "}' zz     // 第几行有几 列
扩展生产案列:网卡的 ip 、流量
[root@localhost ~] # ifconfig ens33 | awk '/netmask/{print " 本机的 ip 地址是 "$4}'
打印 ifconfig ens33 包含 netmask 行 的第四列
[root@localhost ~] # ifconfig ens33 | awk '/RX p/{print $5" 字节 "}'
打印 ifconfig ens33 包含  RX p  行 的第五列
# 根分区的可用量
[root@localhost ~] # df -h | awk 'NR==2{print $4}'
打印 df -h 第二行 第四列

7、BEGIN END 运算

逐行执行开始之前执行什么任务,结束之后再执行什么任务,用 BEGIN END
BEGIN 一般用来做初始化操作,仅在读取数据记录之前执行一次
END 一般用来做汇总操作,仅在读取完数据记录之后执行一次
awk 的运算:
[root@localhost ~] # awk 'BEGIN{x=10;print x}'
// 如果不用引号 awk 就当作一个变量来输出了,所以不需要加$
10
[root@localhost ~] # awk 'BEGIN{x=10;print x+1}'
//BEGIN 在处理文件之前,所以后面不跟文件名也不影响
11
[root@localhost ~] # awk 'BEGIN{x=10;x++;print x}'
11
[root@localhost ~] # awk 'BEGIN{print x+1}'
// 不指定初始值,初始值就为 0 ,如果是字符串,则默认为空
1
[root@localhost ~] # awk 'BEGIN{print 2.5+3.5}'           // 小数也可以运算
6
[root@localhost ~] # awk 'BEGIN{print 2-1}'
1
[root@localhost ~] # awk 'BEGIN{print 3*4}'
12
[root@localhost ~] # awk 'BEGIN{print 3**2}'     
9
[root@localhost ~] # awk 'BEGIN{print 2^3}'                  //^ ** 都是幂运算
8
[root@localhost ~] # awk 'BEGIN{print 1/2}'
0 .5
[root@localhost ~] # awk -F: '/root/' /etc/passwd               //包含 root 的行
// 如果后面有具体打印多少列就没法省略print

8、模糊匹配(~、!~)

模糊匹配,用 ~ 表示包含, !~ 表示不包含
[root@localhost ~] # awk -F: '$1~/root/' zz                     #第一列包含 root 的行
[root@localhost ~] # awk -F: '$1~/ro/' zz               #第一列包含 ro 的行
// 模糊匹配,只要有 ro 就匹配上
[root@localhost ~] # awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd
第七列不包含以 nologin 结尾的行 ,并打印第一列第七列

9、数值与字符串的比较

比较符号: ==    !=    <=    >=    <    >
[root@localhost ~] # awk 'NR==5{print}' zz
[root@localhost ~] # awk 'NR==5' zz                     #打印第5行
[root@localhost ~] # awk 'NR<5' /etc/passwd              #打印行号小于5的行
[root@localhost ~] # awk -F: '$3==0' /etc/passwd             #打印第3列=0的行
      
[root@localhost ~] # awk -F: '$1=="root"' /etc/passwd         #打印第1列=root的行
[root@localhost ~] # awk -F: '$3>=1000' /etc/passwd          #打印带3列uid >= 1000的行
uid >=1000 为普通用户

10、逻辑运算 (&& 、||)

&& || 是逻辑运算符,用于组合多个条件并控制程序流程。
&&(而且)  要求所有条件都为真时才为真,否则为假。
|| (或)       只要有一个条件为真就为真,全为假时才为假。
[root@localhost ~] # awk -F: '$3<10 || $3>=1000' /etc/passwd   第3列小于10或大于等于1000
[root@localhost ~] # awk -F: '$3>10 && $3<1000' /etc/passwd      第3列大于10而且小于1000
[root@localhost ~] # awk -F: 'NR>4 && NR<10' /etc/passwd           行号大于4小于10
打印 1-200 之间所有能被 7 整除并且包含数字 7 的整数数字
[root@localhost ~] # seq 200 | awk '$1%7==0 && $1~/7/'

FSOFSNRFNRRSORS

其他内置变量的用法 FS (输入)、 OFS NR FNR RS ORS
FS 输入字段的分隔符 默认是空格
OFS 输出字段的分隔符 默认也是空格
FNR :读取文件的记录数(行号),从 1 开始,新的文件重新重 1 开始计数,把一个文件追加到另一个文件,行号不累计
NR :行号累计
RS :输入行分隔符 默认为换行符, 把一行内容按照分隔符分割 换行输出
ORS :输出行分隔符 默认也是为换行符, 把多行合并成一行输出

FS输入字段的分隔符

[root@localhost ~] # awk 'BEGIN{FS=":"}{print $1}' pass.txt     
以 :为分隔符,打印第一列

OFS输出字段的分隔符

[root@localhost ~] # awk 'BEGIN{FS=":";OFS="---"}{print $1,$2}' pass.txt
以:为分隔符,输出时以 --- 为分隔符 ,打印第1第2列
#OFS 定义了输出时以什么分隔, $1$2 中间要用逗号分隔,因为逗号默认被映射为 OFS 变量,而这个变量默认是空格

FNR:一个文件追加到另一个文件,行号不累计

[root@localhost ~] # awk '{print FNR,$0}' /etc/resolv.conf /etc/hosts
把 /etc/hosts 追加到 /etc/resolv.conf ,打印行号和内容       FNR行号不追加

NR:个文件追加到另一个文件,行号累计

[root@localhost ~] # awk '{print NR,$0}' /etc/resolv.conf /etc/hosts
把 /etc/hosts 追加到 /etc/resolv.conf ,打印行号和内容       FNR行号追加

RS:一行内容按照分隔符分割 换行输出

[root@localhost ~] # awk 'BEGIN{RS=":"}{print $0}' /etc/passwd
把一行内容以 :为分隔符 分割 ,换行输出
#RS: 指定以什么为换行符,这里指定是冒号,你指定的肯定是原文里存在的字符

ORS:多行合并成一行输出

[root@localhost ~] # awk 'BEGIN{ORS=" "}{print $0}' /etc/passwd
// 把多行合并成一行输出,输出时以空格为分隔符    (本来默认的是回车键)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3266679.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Gitlab】SSH配置和克隆仓库

生成SSH Key ssh-keygen -t rsa -b 4096 私钥文件: id_rsa 公钥文件:id_rsa.pub 复制生成的ssh公钥到此处 克隆仓库 git clone repo-address 需要进行推送和同步来更新本地和服务器的文件 推送更新内容 git push <remote><branch> 拉取更新内容 git pull &…

【Django】django模板与前端技术(html模板)

文章目录 “python包html”还是“html包python”?1.新建模板2.模板语法3.views.py测试 “python包html”还是“html包python”? 在前端页面中html代码比python多得多&#xff0c;所以一定是html包python最优&#xff01;于是引出今天的模板。 大体分为三个步骤&#xff1a;…

CPU350% JVM GC频繁并GC不掉EXCEL导出

背景&#xff1a; 有个Excel导出的需求&#xff0c;测试的时候&#xff0c;只要连续导出大量的数据就会导致FAT机器反请求反应迟钝&#xff0c;甚至卡死&#xff0c;无法恢复。 排查&#xff1a; 1 跳板机跳到机器上&#xff0c;查看 项目 ipd 执行ps -ef | grep 项目名称.j…

解决学生技能短板:泰迪智能科技2024年中职大数据实验室,全面提升学生实践能力

一、中职院校现状及实验室建设背景 在当今信息化时代&#xff0c;大数据技术已成为国家战略发展的重要方向。中职院校作为我国职业教育体系的重要组成部分&#xff0c;肩负着培养高素质技术技能人才的重任。然而&#xff0c;目前我国中职院校在大数据教育方面存在以下问题&…

Django Web开发:构建强大RBAC权限管理系统的实战指南

文章目录 前言一、rbac 基于角色的权限管理1.acl 基于用户的权限管理2.rbac 基于角色的权限管理 二、应用示例1.配置角色资源a.分析表b.核心逻辑c.使用transfer在前端实现资源配置d.页面效果 2.登录时获取对应权限a.员工登录b.中间件c.前端请求d.效果图 3.前端-路由守卫-页面权…

鸿蒙HarmonyOS开发:如何灵活运用动画效果提升用户体验

文章目录 一、动画概述1、动画的目的 二、显式动画 (animateTo)1、接口2、参数3、AnimateParam对象说明4、示例5、效果 三、属性动画 (animation)1、接口2、参数3、AnimateParam对象说明4、系统可动画属性4、示例5、效果 一、动画概述 动画的原理是在一个时间段内&#xff0c;…

IDEA缓存和索引

IDEA缓存和索引 —2020年06月10日 IntelliJ IDEA首次加载项目的时候。都会创建索引&#xff0c;而创建索引的时间根项目的文件多少成正比。 IntelliJ IDEA的缓存和索引主要是用来加快文件查询&#xff0c;从而加快各种查找、代码提示等操作的速度。 某些特殊情况下&#xf…

剑和沙盒 1 - Windows Sandbox 简介

Windows Sandbox 提供了一个轻量级桌面环境&#xff0c;可以安全地独立运行应用程序。安装在 Windows Sandbox 环境中的软件仍处于“沙盒”状态&#xff0c;独立于主机运行。 沙盒是临时的。关闭后&#xff0c;所有软件、文件和状态都会被删除。每次打开应用程序时&#xff0c…

scrapy 爬取旅游景点相关数据(一)

第一节 Scrapy 练习爬取穷游旅游景点 本项目为scrapy 练手项目&#xff0c;爬取的是穷游旅游景点列表数据 0 系统的环境 现在网上可以找到很多scrapy版本的视频或者代码&#xff0c;为避免混淆&#xff0c;下面列出本文开发过程中使用的软件版本。 scrapy 和 selenium 新版本和…

【NPU 系列专栏 3.1 -- - NVIDIA 的 Orin 和 Altan 和 Thor 区别】

请阅读【嵌入式及芯片开发学必备专栏】 文章目录 NVIDIA Orin、Altan 和 ThorNVIDIA Orin 简介NVIDIA Orin 主要特点NVIDIA Orin 应用场景 NVIDIA Altan 简介NVIDIA Altan 主要特点NVIDIA Altan 应用场景 NVIDIA Thor 简介NVIDIA Thor 主要特点NVIDIA Thor 应用场景 与 Hopper …

重生之“我打数据结构,真的假的?”--5.堆(无习题)

1.堆的概念与结构 如果有⼀个关键码的集合 &#xff0c;把它的所有元素按完全⼆叉树的顺序存储⽅ 式存储&#xff0c;在⼀个⼀维数组中&#xff0c;并满⾜&#xff1a; &#xff08; 且 &#xff09;&#xff0c; i 0、1、2... &#xff0c;则称为⼩堆(或⼤堆)。将根结点最⼤的…

【数组中的 k-diff 数对】python刷题记录

R2-哈希表。 有点easy的感觉 class Solution:def findPairs(self, nums: List[int], k: int) -> int:#查找对的方式是查找xk&#xff0c;不查找x-k是避免查找重复#此外&#xff0c;需要注意k0的问题mp{}for x in nums:if x in mp:mp[x]1else:mp[x]1ret0for x,cnt in mp.ite…

2024年7月25日(Git gitlab以及分支管理 )

分布式版本控制系统 一、Git概述 Git 是一种分布式版本控制系统,用于跟踪和管理代码的变更。它是由Linus Torvalds创建的,最 初被设计用于Linux内核的开发。Git允许开发人员跟踪和管理代码的版本,并且可以在不同的开 发人员之间进行协作。 Github 用的就是Git系统来管理它们的…

C++内存管理和模板/stl初识

前言 c兼容C语言&#xff0c;但它因为有类和对象的概念&#xff0c;C语言原生的那套内存管理函数在特定场景下还是有些捉襟见肘的&#xff0c;为此c在C语言的基础上引入新的内存管理方案&#xff0c;今天我们就来简单的认识一下c的内存管理。除此之外&#xff0c;模板也是c引入…

数据结构与算法——赫夫曼编码

1、基本介绍 &#xff08;1&#xff09;赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding)&#xff0c;又称霍夫曼编码&#xff0c;是一种编码方式。属于一种程序算法。赫夫曼编码是赫夫曼树在电信通讯中经典的应用之一。 &#xff08;2&#xff09;赫夫曼编码被广泛地应用于数据…

C语言程序设计13

程序设计13 问题13_1代码13_1结果13_1 问题13_2代码13_2结果13_2 问题13_3代码13_3结果13_3 问题13_1 函数 f u n fun fun 的功能是&#xff1a;把形参 s s s 所指字符串中下标为奇数的字符右移到下一个奇数位置&#xff0c;最右边被移出字符串的字符绕回放到第一个奇数位置&…

77.WEB渗透测试-信息收集-框架组件识别利用(1)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;76.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;16&#xff09; java&#xff…

Cannot access org.springframework.context.ConfigurableApplicationContext

Cannot access org.springframework.context.ConfigurableApplicationContext SpringApplication.run曝红 解决方案&#xff1a; File -> Invalidate Cache and Restart 如果对你有用就点个赞&#xff01;

FPGA开发——奇数分频器的设计

一、概论 在我们进行FPGA分频器的学习当中&#xff0c;我们通常会学习怎样完成任意分频器的设计&#xff0c;其中就包括偶数分频最为常见。在实现的分频器的同时我们也会不定时的要求同时设置对应的占空比。今天我们就来看看怎样同时设置奇数分频器和其对应50%的占空比。 二、…

LabVIEW操作系列1

系列文章目录 我的记录&#xff1a; LabVIEW操作系列 文章目录 系列文章目录前言五、特殊用法5.1 取值范围表示5.2 对输入值取值范围进行限定5.3 控制多个While循环停止运行。5.4 获取按钮上的文本5.5 获取按钮上的文本【进阶】 六、使用步骤1.引入库2.读入数据 七、其余功能7.…