AWK语言

   一. awk

  awk:报告生成器,格式化输出。

  在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。而awk比较倾向于将一行分成多个字段,然后进行处理。

  AWK信息的读入也是逐行指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互 的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。

  其中awk有多种版本:

  • AWK
  • NAWK
  • GAWK(目前使用)

  gawk、vim和awk的区别

    gawk:模式扫描和处理语言,可以实现下面功能

    vim:是将整个文件加载到内存中在加载到你的内存中,但这取决于你的内存文件是否能够容纳文本文件的大小。

    awk(语言):读取一行,处理一行

  工作模式:

    sed命令常用于一整行的处理,而awk比较倾向于一整行的分成多个字段处理,默认情况下字段的分隔符为空格或tab键。awk执行结果可以通过print的功能将字段数据打印出来。

  格式:awk [options]  'program' var=value  file…

  解释说明:

    program是被放在单引号中,通常由三个部分组成:

  • BEGIN语句块
  • 模式匹配的通用语句块
  • END语句块
常用选项功能
-F分隔符指明输入时用到的字符分隔符,默认的字符分隔符是若干个连续的空白符
-vvar=value变量赋值

  program格式:xxxxxxxxxx1 11 1pattern{action statements;..} 

    pattern:决定动作语句何时触发及触发事件。比如:BEGIN、END、正则表达式等

    action statements(行为语句):对数据进行处理 ,放在{}内指明。常见的是:print、printf

  • output statement(输出语句):print、printf
  • expressions(表达式):算术表达式、比较表达式等
  • compound statement(组合语句)
  • control statement(控制语句):if语句、for、while等
  • input statement(输入语句)

  执行过程

第一步:执行BEGIN{action;… }语句块中的语句
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,
从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{action;…}语句块

  解释:
    BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
    END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块
    pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块

  1.1 基本动作

    print动作

     1.2 BEGIN

    取出已用项--方法一

     取出已用项--方法二

    取出已用项--方法三

    BEGIN{}模式表示,在处理指定的文本前,需要先执行BEGIN模式中的指定动作; awk再处理指定的文本,之后再执行END模式中的指定动作,END{}语句中,一般会放入打印结果等语句。

  1.3 常见的内置变量

    格式:awk 选项 '模式{print }'

选项功能
FS指定每段的字段分隔符,缺省默认认为空格或制表符,与 “-F”作用相同 -v "FS=:"
OFS输出时的分隔符
NF当前处理的行的字段个数
NR当前处理的行的行数(序数)
$0当前处理的行的整个内容
$n当前处理行的第n个字段(第n列)
FILENAME被处理的文件名
RS行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理

    FS

    支持变量

       -F和-FS一起使用,-F的优先级更高

    OFS

    RS

      默认是已 /n (换行符)为一条记录的分隔符

    FS

      代表字段的个数

       $NF代表最后一个字段 

       打印倒数第二列

      打印已用项

    NR

      行号

    FNR

    FILENAME

      显示处理文件名

  1.4 模式PATTERN

    格式:awk '模式{处理动作}'

    PATTERN:根据pattern条件,过滤匹配的行,再做处理

  1.4.1 模式为空

    如果模式为空表示每一行都匹配成功,相当于没有额外条件

  1.4.2 正则匹配

     /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来。举例:awk  '/^UUID/{print $1}'  /etc/fstab

  1.4.3 line range:行范围

    不支持使用行号,但是可以使用变量NR 间接指定行号加上比较操作符 或者逻辑关系

算术操作符
x+y, x-y, x*y, x/y, x^y, x%y
-x:转换为负数
+x:将字符串转换为数值
比较操作符:
==, !=, >, >=, <, <=


逻辑
与:&&,并且关系
或:||,或者关系
非:!,取反关系

  1.4.4 找到10:00到11:00之间的日志

awk '/10/,/11/'  文件名

sed -nr '/10/,/11/p'  文件名

  1.4.5 BEGIN END

    BEGIN{}:仅在开始处理文件中的文本之前执行一次

    END{}:仅在文本处理完成之后执行一次

  1.4.6 关系表达式

    关系表达式结果为“”才会被处理

    真:结果为非0值,非空字符串

    假:结果为空字符串或0值

  1.5 条件判断(扩展)

    格式:awk 选项 '模式 {actions}'

    条件判断写在 actions里

if(condition){statement;…}[else statement]
if(condition1){statement1}else if(condition2){statement2}else if(condition3){statement3}...... else {statementN}

condition1:条件
statement1:语句

if语句:awk的if语句也分为单分支、双分支和多分支
单分支为if(判断条件){执行语句}
双分支为if(判断条件){执行语句}else{执行语句}
多分支为if(判断条件){执行语句}else if(判断条件){执行语句}else if(判断条件){执行语句}else if(判断条件){执行语句} 

  1.6 for  | while

语法:

  for(expr1;expr2;expr3) {statement;…}
  for(variable assignment;condition;iteration process) {for-body}
  for(var in array) {for-body}

  1.7 数组(awk数组) 

    awk数组特性:

  • awk的数组是关联数组(即key/value方式的hash数据结构),索引下标可为数值(甚至是负数、小数等),也可为字符串
  1. 在内部,awk数组的索引全都是字符串,即使是数值索引在使用时内部也会转换成字符串
  2. awk的数组元素的顺序和元素插入时的顺序很可能是不相同的
  • awk数组支持数组的数组

  1.7.1 数组长度

    awk提供了 length() 函数来获取数组的元素个数,它也可以用于获取字符串的字符数量。还可以获取数值转换成字符串后的字符数量。

  1.7.2 遍历数组

    格式:for(var in array) {for-body}

  1.8 脚本

    将awk程序写成脚本,直接调用或执行

  1.9 彩蛋

    1.9.1.提出下面的IP地址和字段

awk
58.87.87.99 - - [09/Jun/2020:03:42:43 +0800] "POST /wp-cron.php?doing_wp_cron=1591645363.2316548824310302734375 HTTP/1.1" ""sendfileon
128.14.209.154 - - [09/Jun/2020:03:42:43 +0800] "GET / HTTP/1.1" ""sendfileon
64.90.40.100 - - [09/Jun/2020:03:43:11 +0800] "GET /wp-login.php HTTP/1.1"""sendfileo

64.90.40.100  09/Jun/2020:03:43:11

 解法1:cat test|sed -nr 's/(.*) - - \[(.*) \+.*/\1 \2/p'

 解法2:cat test|awk -F"[[]" '{print $1,$5}'

 解法3:cat test|awk -F"[[]+" '{print $1,$4}'

    1.9.2.提取host.txt主机名后再放回host.txt文件   >>

vim host.txt

1 www.kgc.com
2 mail.kgc.com
3 ftp.kgc.com
4 linux.kgc.com
5 blog.kgc.com

解法1:cat host.txt awk -F"[ .]" 'print $2' >>host.txt

解法2:cat host.txt | cut -d "." -f1|tr -d "[0-9 ]">>host.txt

解法3:cat host.txt | sed -nr 's/[0-9](.*)\.kgc\.com/\1/p'>>host.txt

    1.9.3.统计/etc/fstab文件中每个文件系统类型出现的次数

cat /etc/fstab | grep -v "^#"|grep -v "^$"|awk '{print $3}'  sort|uniq -c

    1.9.4.统计/etc/fstab文件中每个真单词出现的次数

解法1:cat /etc/fstab | grep -Eo "\b[a-zA-Z]+\b" |wc -l

解法2:cat /etc/fstab | grep -Eo "\b[[:alpha:]]\b" |wc -l

    1.9.5.提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字

echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" | grep -o [0-9]

    1.9.6.查出/tmp/的权限,以数字方式显示

stat /tmp|awk -F "[(/]" 'NR=4{print $2}'

    1.9.7.查出用户UID最大值的用户名、UID及shell类型

awk $3>1000{print $3,$1} /etc/passwd |sort -n |uniq -c

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

预检请求:为跨域请求保驾护航(下)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Python面向对象:什么是面向对象程序设计

编程范式 编程即写程序or代码&#xff0c;具体是指程序猿用特定的语法数据结构算法编写代码&#xff0c;目的是用来告诉计算机如何执行任务。 如果把编程的过程比喻为练习武功&#xff0c;那么编程范式指的就是武林中的各种流派&#xff0c;而在编程的世界里最常见的两大流派就…

numpy模块:从基础到高级的完整指南【第88篇—NumPy数组操作】

numpy模块&#xff1a;从基础到高级的完整指南 在Python的科学计算领域&#xff0c;NumPy模块是一个不可或缺的利器。它提供了丰富的数学函数和矩阵操作&#xff0c;使得数据处理、分析和科学计算变得更加高效。本文将带你初步了解NumPy模块&#xff0c;并通过实例代码深入解析…

JUC并发编程

JUC并发编程 JUC概述 JUC是java.util.concurrent包的简称&#xff0c;即Java并发编程工具包&#xff0c;目的是为了更好地支持高并发任务&#xff0c;让开发者进行多线程编程时有效减少竞争条件和死锁线程。 并发编程 一些基本概念&#xff1a; 进程与线程&#xff1a; 进…

C#,二叉搜索树(Binary Search Tree)的迭代方法与源代码

1 二叉搜索树 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09;又称二叉查找树或二叉排序树。 一棵二叉搜索树是以二叉树来组织的&#xff0c;可以使用一个链表数据结构来表示&#xff0c;其中每一个结点就是一个对象。 一般地&#xff0c;除了key和位置…

基于 Python 深度学习的车辆特征分析系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

算法之力扣数青蛙

题目连接 文章目录 题目解析算法原理第一步第二步第三步第三步第四步指向o 代码讲解代码实现 题目解析 先给大家来讲解一下这个题目的意思吧&#xff0c;这个题目是说呢给你一个蛙叫的字符串让你去设计一个算法求出发出这种蛙叫最少需要几只青蛙。比如说第一个样例发出这种叫声…

端口号被占用怎么解决

1、快捷键"winR"打开运行&#xff0c;在其中输入"cmd"命令&#xff0c;回车键打开命令提示符。 2、进入窗口后&#xff0c;输入"netstat -ano"命令&#xff0c;可以用来查看所有窗口被占用的情况。 比如端口号为7680的端口被占用了&#xff0c…

Python入门:常用模块—logging模块

logging日志的分级&#xff1a; debug(),info(),warning(),error(),critical() 5个级别 最简单用法 1 2 3 4 import logging logging.warning("user [mike] attempted wrong password more than 3 times") logging.critical("server is down") 输出&…

【洛谷题解】P1601 A+B Problem(高精)

题目链接&#xff1a;AB Problem&#xff08;高精&#xff09; - 洛谷 题目难度&#xff1a;普及- 涉及知识点&#xff1a;高精度加法 题意&#xff1a; 分析&#xff1a;直接套用高精度加法模版即可 AC代码&#xff1a; #include<bits/stdc.h> using namespace std…

【搭建跨境电商独立站】跨境电商独立站的6大模式,任你选择!

在几年前跨境电商独立站和第三方平台基本上是同步发展起来的&#xff0c;但在后期的发展过程中&#xff0c;独立站经过不同时期的革新&#xff0c;形成了自己的模式。 当你准备好搭建独立站的时候&#xff0c;首先你需要了解的就是独立站运营的模式类型&#xff0c;并找到最适合…

LiveGBS流媒体平台GB/T28181功能-redis订阅国标设备状态redis订阅通道状态subscribe device操作及示例

支持Redis订阅国标设备状态及国标通道状态上线离线 1、设备状态监听的烦恼2、device订阅2.1、设备上线消息2.2、设备离线消息2.2、通道上线消息2.2、通道离线消息 3、订阅示例3.1、连接REDIS3.2、订阅device示例3.3、设备上线示例3.3.1、注册上线后 3.4、设备离线示例3.4.1、注…

批评openai

杨立昆对OpenAI的批评主要集中在几个方面。首先&#xff0c;他反驳了OpenAI首席科学家Ilya Sutskever关于AI可能已经拥有某种自主意识的观点。杨立昆认为&#xff0c;当前的神经网络并不具备这种特定宏架构&#xff0c;因此无法拥有自主意识。他强调&#xff0c;即使是最轻微的…

Stable Diffusion系列(六):原理剖析——从文字到图片的神奇魔法(潜空间篇)

文章目录 LDM概述原理模型架构自编码器模型扩散模型条件引导模型图像生成过程 实验结果指标定义IS&#xff08;越大越好&#xff09;FID&#xff08;越小越好&#xff09; 训练成本与采样质量分析不带条件的图片生成基于文本的图片生成基于语义框的图片生成基于语义图的图片生成…

MyBatis-Plus:通用分页实体封装

分页查询实体&#xff1a;PageQuery package com.example.demo.demos.model.query;import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.Data; import org.springframework.util.St…

milvus insert api的数据结构源码分析

insert api的数据结构 一个完整的insert例子: import numpy as np from pymilvus import (connections,FieldSchema, CollectionSchema, DataType,Collection, )num_entities, dim 10, 3print("start connecting to Milvus") connections.connect("default&q…

基于SSM的电影购票系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的电影购票系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

Eclipse 分栏显示同一文件

Eclipse 分栏显示同一文件 1. Window -> EditorReferences 1. Window -> Editor Toggle Split Editor (Horizontal) &#xff1a;取消或设置水平分栏显示 Toggle Split Editor (Vertical) &#xff1a;取消或设置垂直分栏显示 References [1] Yongqiang Cheng, https:/…

综合特征融合的实用图像恢复技术-CMFNet

综合特征融合的实用图像恢复技术-CMFNet 综合特征融合的实用图像恢复技术-CMFNet项目背景与意义模型架构与关键思想代码实现与功能函数恢复效果展示参考资料 综合特征融合的实用图像恢复技术-CMFNet 图像恢复一直是计算机视觉领域的重要研究方向之一。它涵盖了诸多任务&#x…

K8s服务发现组件之CoreDNS/NodeLocalDNS /kubeDNS

1 coredns 1.1 概述 1.1.1 什么是CoreDNS CoreDNS 是一个灵活可扩展的 DNS 服务器&#xff0c;可以作为 Kubernetes 集群 DNS&#xff0c;在Kubernetes1.12版本之后成为了默认的DNS服务。 与 Kubernetes 一样&#xff0c;CoreDNS 项目由 CNCF 托管。 coredns在K8S中的用途,…