当前位置: 首页 > news >正文

awk相关知识

目录

1.概述

2.工作原理

3、工作流程

3.1 运行模式

3.2 执行流程

4.基本语法

4.1 命令格式

5、实战案列

5.1 案列文本测试

5.2 内建变量

5.3 BEGIN END 运算

5.3.1 awk的运算

5.3.2 模糊匹配

5.3.3 关于数值与字符串的比较

5.3.4 逻辑运算


1.概述

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。 它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作数据。可以来自标准输入也可以是管道或文件

在 linux 上常用的是 gawk,awk 是 gawk 的链接文件 awk---->gawk,即: gun awk

2.工作原理

当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出。如果没有定义匹配条件默认是匹配所有数据行,awk隐含循环,条件匹配多少次动作就会执行多少次 逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变中并按模式或者条件执行编辑命令。

sed命令常用于一整行的处理,而awk比较、倾向于将一行分成多个""字段"然后再进行处理。awk 信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过 程中,可以使用逻辑操作符" &&"表示"与"、"||表示"或"、"!"表示非";还可以进行简单的数学运算,如+、 一、*、/、%、^分别表示加、减、乘、除、取余和乘方。

3、工作流程

pattern [ˈpætn] 模式 ; process处理

任何 awk 语句都是由模式和动作组成,一个 awk 脚本可以有多个语句。模式决定动作语句的触发条件和触发时间

3.1 运行模式

正则表达式 : /root/ 匹配含有 root 的行 /*.root/

关系表达式: < > && || + *

匹配表达式: ~ !~

动作:变量 命令 内置函数

流控制语句它的语法结构如下:

3.2 执行流程

BEGIN 语句设置计数和打印头部信息,在任何动作之前进行;

END 语句输出统计结果,在完成动作之后执行;

AWK 执行的流程非常简单:读(Read)、执行(Execute)与重复(Repeat)。

AWK程序的结构:

①开始块:

开始块就是在程序启动的时候执行的代码部分,并且它在整个过程中只执行一次。一般情况 下,我们在开始块中初始化一些变量。BEGIN是AWK的关键字,因此它必须是大写的。不过,开始块部 分是可选的,你的程序可以没有开始块部分。

②主体块:

对于每一个输入的行,都会执行一次主体部分的命令。默认情况下,对于输入的每一行,AWK都会执行命令。注意:在主体块部分,没有关键字存在。

③结束块

它是在程序结束时执行的代码。END也是AWK的关键字,它也必须大写。与开始块相似,结束块也是可选的。

AWK 工作通过三个步骤:

1、读(Read):从文件、管道或标准输入中读入一行然后把它存放到内存中;

2、执行(Execute):对每一行数据,根据 AWK 命令按顺序执行。默认情况是处理每一行数据,也可以指定模式;

3、重复(Repeat):一直重复上述两个过程直到文件结束。

4.基本语法

4.1 命令格式

awk 选项' 模式或条件{操作}' 文件1 文件2 ...

awk -f 脚本文件 文件1 文件2 ..

格式:awk关键字 选项 命令部分 '{xxxx}' 文件名 **

AWK 支持两种不同类型的变量:内建变量(可直接使用),自定义变量awk 内置变量(预定义变量)

FS:指定每行文本的字段分隔符,默认为空格或制表位。

NF:列的个数

NR:当前处理的行的行号(序数)。 在执行过程中对应于当前的行号

$0:当前处理的行的整行内容。

$n:当前处理行的第 n 个字段(第 n 列)。比如: $1 表示第一个字段,$2 表示第二个字段

FILENAME:被处理的文件名(当前输入文件的名)。

FNR 各文件分别计数的行号

OFS 输出字段分隔符(默认值是一个空格)

ORS 输出记录分隔符(默认值是一个换行符)

RS:行分隔符。awk从文件上读取资料时,将根据Rs的定义把资料切割成许多条记录, 而awk一次仅          读入一条记录,以进行处理。预设值是" \n'                                                                                          简说:数据记录分隔,默认为\n,即每行为一条记录

5、实战案列

5.1 案列文本测试

awk '{print "hello"}' </etc/passwd      #将/etc/passwd文件中的内容输出给

或者写为awk '{print "hello"}' /etc/passwd

awk默认把这一行当做一列,因为没有被空格分隔,awk默认以空格或tab键分隔

awk '{print $1}' zz      #打印所有行中的第1列

awk  -F '{print $1}' zz      #指定冒号(:)为分隔符,打印所有行中的第1列

awk -Fx '{print $1}' zz      #指定x为分隔符,打印所有行中的第1列

zz1文件内容为"hello word"      #逗号有空格的作用

awk -F: '{print $1"\t"$2}' /etc/passwd      #以冒号(:)为分隔,\t代表四个空格

awk -F[:/] '{print $9}' zz      #以(/)和(:)为分隔符,将所有行的第九列打印出来

5.2 内建变量

awk常用内置变量:$1、$2、NF、NR、$0

$1:代表第一列

$2:代表第二列以此类推

$0:代表整行

NF:一行的列数

NR:行数

awk -F : '/root/{print $0}' zz      #打印包含root的所有行      

awk -F: '/root/{print $1}' zz      #打印含root的行的第1列

awk -F: '/root/{print} $1,$6' zz      #打印含root的行的第1列和第6列

awk '/root/' /etc/passwd      #打印含root的所有行,

相当于awk '/root/print{print $0}' /etc/passwd,省略简写

awk -F[:/] '{print NF}' zz       #以:和/为分隔符,打印所有行的列数

awk -F[:/] '{print NR}' zz      #以:和/为分隔符,打印所有行的行数

awk -F: '{print NR, $0}' zz      #打印当前行的行号和所有内容

awk 'NR==2{print}' /etc/passwd      #打印行号为2的所有内容

awk 'NR==2' /etc/passwd      #与上面结果相同,省略写法

awk -F 'NR==2{print $1}' zz      #打印行数为2的行的第1列

awk -F: '{print $NF}' zz      #以:为分隔符,打印所有行的最后一列

awk 'END{print NR}' /etc/passwd      #打印最后一行的行数

awk 'END{print $0}' zz      #打印最后一行的所有字段内容

awk -F: '{print "当前行有"NF"列"}' zz      #在每一行打印"当前行有"NF"列"

awk -F: '{print "第"NR"行有"NF"列"}' zz      #打印第NR行有NF列

拓展案例

查询本机ip地址

查询接收字节数

查询根分区的可用量

5.3 BEGIN END 运算

逐行执行开始之前执行什么任务,结束之后再执行什么任务,用BEGIN、END BEGIN一般用来做初始化操作,仅在读取数据记录之前执行一次 END一般用来做汇总操作,仅在读取完数据记录之后执行一次

5.3.1 awk的运算

5.3.2 模糊匹配

模糊匹配,用~表示包含,!~表示不包含

awk -F: '/root/' /etc/passwd      #打印所有含root的行

awk -F: '$1~/root/' /etc/passwd      #打印第一列中含root的行

awk -F: '$1~/ro/' /etc/passwd      #打印第一列含有ro的行

awk -F: '$7!~/nologin$/{print$1,$7}' /etc/passwd      #打印第7列不含nologin的行的第1列和第7列

5.3.3 关于数值与字符串的比较

比较符号:== != <= >= < >

awk 'NR==5{print}' /etc/passwd      #打印行号为5的行

awk 'NR==5' /etc/passwd       #与上内容相同,省略写法

awk 'NR<5' /etc/passwd      #打印行数小于5的所有行

awk -F '$3==0' /etc/passwd      #以:为分隔符,将第三列为0的所有行打印出来

awk -F: '$1=="root"' /etc/passwd      #打印第1列为root的所有行,精准匹配要把root加隐号

awk -F: '$3>=1000' /etc/passwd      #将第三列大于1000的所有行打印出来

5.3.4 逻辑运算

&& 和 || 是逻辑运算符,用于组合多个条件并控制程序流程。

  • && 要求所有条件都为真时才为真,否则为假。

  • || 只要有一个条件为真就为真,全为假时才为假。

awk -F: '$3<10 || $3>=1000' zz      #打印第三列小于10或者大于1000的所有行

awk -F: '$3>10 && $3<1000' zz      #打印第三列大于10且小于1000的所有行

awk -F: 'NR>4 && NR<10' zz      #打印行数大于4且小于10的所有行

5.3.5其他内置变量的用法

FS(输入)、OFS、NR、FNR、RS、ORS

FS:输入字段的分隔符 默认是空格

OFS:输出字段的分隔符 默认也是空格

FNR:读取文件的记录数(行号),从1开始,新的文件重新重1开始计数

RS:输入行分隔符 默认为换行符

ORS:输出行分隔符 默认也是为换行符

awk 'BEGIN{FS=":"}{print $1}'      #输入字段的分隔符为:

awk 'BEGIN{FS=":";OFS="---"}{print $1,$2}'      #以---为分隔符打印输出结果

awk  '{print FNR,¥0}'  /etc/resolv.conf  /etc/hosts      #不同文件分开计数

awk 'BEGIN{RS=":"}{print $0}' /etc/passwd      #指定:为换行符

awk 'BEGIN{ORS=""}{print $0}' /etc/passwd      #把多行合并成一行输出,输出的时候自定义以空                                                                               格分隔每行,本来默认的是回车键

http://www.dtcms.com/a/365982.html

相关文章:

  • C++完美转发
  • 【FastDDS】Layer DDS之Domain ( 04-DomainParticipantFactory)
  • 专项智能练习(Photoshop软件基础)
  • 智能高效内存分配器测试报告
  • 【CMake】message函数
  • C++对象构造与析构
  • numpy meshgrid 转换成pygimli规则网格
  • cppreference_docs
  • 稳居全球TOP3:鹏辉能源“3+N” 布局,100Ah/50Ah等户储电芯产品筑牢市场优势
  • 【C++】Vector核心实现:类设计到迭代器陷阱
  • MySQL:表的约束上
  • C# 代码中的“熵增”概念
  • 单片机:GPIO、按键、中断、定时器、蜂鸣器
  • 《单链表经典问题全解析:5 大核心题型(移除元素 / 反转 / 找中点 / 合并 / 回文判断)实现与详解》
  • 【面试题】词汇表大小如何选择?
  • PS大神级AI建模技巧!效率翻倍工作流,悄悄收藏!
  • 本地化AI问答:告别云端依赖,用ChromaDB + HuggingFace Transformers 搭建离线RAG检索系统
  • OpenCV的阈值处理
  • ChartView的基本介绍与使用
  • shell编程从0基础--进阶 1
  • 如何高效记单词之:抓住首字母——以find、fund、fond、font为例
  • Linux `epoll` 机制的入口——`epoll_create`函数
  • Java并发编程中的CountDownLatch与CompletableFuture:同步与异步的完美搭档
  • 驱动增长的双引擎:付费搜索与自然搜索的终极平衡策略
  • Loot模板系统
  • helm应该安装在哪些节点
  • ABAQUS多尺度纤维增强混凝土二维建模
  • 微信小程序-day3
  • 【mac】macOS上的实用Log用法
  • 使用Navicat去批量传输数据库的表结构