Linux ---- Shell编程三剑客之AWK

一、awk处理文本工具

1、awk概述

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

2、awk工具

  • 功能强大的编辑工具
  • 无交互情况下实现复杂的文本操作

命令格式

awk 选项 '模式或条件 {处理动作}' 文件 1 文件 2 …
awk -f 脚本文件 文件 1 文件 2 …program分为两部分
①处理动作 {print  {print}},,print可以写多个,可以嵌套
②正则表达式

常用选项

-F   指定分隔符,指明输入时用到的字段分隔符,默认的分隔符是若干个连续空白符
-v   var=value  自定义变量
-F  和 -FS 不要一起使用, -F的优先级高

二、工作原理

  • 当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出
  • 如果没有定义匹配条件默认是匹配所有数据行,awk隐含循环,条件匹配多少次动作就会执行多少次

逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。

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

三、基础用法

1、print动作

ifconfig ens33 |awk '{print}'    ##打印ens33网卡

ifconfig ens33 |awk '/netmask/{print}'    ##查找包含netmask的行

awk '{print "hello"}'

你有多少行文件就打印多少行hello

awk 'BEGIN{print 100+200}'    ##直接打印出结果
200awk '{print 100+200}'         ###有几行打印几次结果awk 'BEGIN{print 100*200}'    ##也可以相乘
20000

用awk提取磁盘 "已用" 列

+号代表空格有多个

打印passwd文件的第一列和第三列

以冒号为分隔符

也可以改为其他分隔符

++++

tab分隔符"\t"

[root@localhost ~]#wc -l /etc/passwd
45 /etc/passwd[root@localhost ~]#awk -F: '{print $0}' /etc/passwd         #$0代表全部元素[root@localhost ~]#awk -F: '{print $1}' /etc/passwd         #代表第一列[root@localhost ~]#awk -F: '{print $1,$3}' /etc/passwd      #代表第一第三列[root@localhost ky15]#awk '/^root/{print}' passwd           #已root为开头的行[root@localhost ky15]#grep -c "/bin/bash$" passwd           #统计当前已/bin/bash结尾的行
2

2、awk常见的内置变量

awk 选项 '模式{print }’

选项

-v:定义变量  awk中的变量,,不会影响bash

-F:指定分隔符

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

1.FS :指定每行文本的字段分隔符,缺省默认为空格或制表符(tab)。与 “-F”作用相同  -v "FS=:"

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

打印passwd文件的第一列和第三列

fs

OFS:输出时的分隔符

RS:行分隔符

NF: 代表字段个数   *****

打印倒数第二例

NR:显示行号   *****

ifconfig ens33 |awk 'NR ==1,NR==3{print}'    ##打印1到三行

awk -F: '$3>=1000{print $1,$3}' /etc/passwd

FNR:读取文件的记录行号(从1开始,若读取新的文件依旧是从1开始)

这样他将两个文件的行数并在一起算,passwd一共41行,其他的是fstab的行数

3、自定义变量

printf   

  • %s:显示字符串
  • %d, %i:显示十进制整数
  • %f:显示为浮点数
  • %e, %E:显示科学计数法数值 
  • %c:显示字符的ASCII码
  • %g, %G:以科学计数法或浮点形式显示数值
  • %u:无符号整数
  • %%:显示%自身
awk -F:  '{printf "%s",$1}' /etc/passwd
awk -F:   '{printf "%s\n",$1}' /etc/passwd
awk -F:   '{printf "%20s\n",$1}' /etc/passwd
awk -F:   '{printf "%-20s\n",$1}' /etc/passwd
awk -F:   '{printf "%-20s %10d\n",$1,$3}' /etc/passwd
awk -F:   '{printf "Username: %s\n",$1}' /etc/passwd
awk -F:   '{printf “Username: %sUID:%d\n",$1,$3}' /etc/passwd
awk -F:   '{printf "Username: %25sUID:%d\n",$1,$3}' /etc/passwd
awk -F:   '{printf "Username: %-25sUID:%d\n",$1,$3}' /etc/passwd

4、模式pattern

awk '模式{处理动作}'

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

1.模式为空

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

awk -F: '{print $1,$3}' /etc/passwd

2.正则匹配

/regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来

awk  '/^UUID/{print $1}'  /etc/fstab

3.line ranges:行范围

  • 不支持使用行号,但是可以使用变量NR 间接指定行号加上比较操作符 或者逻辑关系
[root@centos7 ~]#awk 'NR==3{print $1}' /etc/passwd
[root@centos7 ~]#seq 10 | awk 'NR>=3 && NR<=6'
[root@centos7 ~]#awk 'NR>=3 && NR<=6{print NR,$0}' /etc/passwd[root@centos7 ~]#awk '/^bin/,/^adm/' /etc/passwd
#bin开头 到adm开头[root@localhost ky15]#awk '{print $1,NR}' /etc/passwd
##行号
[root@localhost ky15]#awk 'NR==2{print $1}' /etc/passwd
#只取第二行的第一个字段
[root@localhost ky15]#awk 'NR==1,NR==3{print}' passwd 
#打印出1到3 行
[root@localhost ky15]#awk 'NR==1||NR==3{print}' passwd
#打印出1和3行
[root@localhost ky15]#awk '(NR%2)==0{print NR}' passwd
#打印出函数取余数为0行
[root@localhost ky15]#awk '(NR%2)==1{print NR}' passwd
#打印出函数取余数为1的行
[root@localhost ky15]#awk 'NR>=3 && NR<=6{print NR,$0}' /etc/passwd[root@localhost ky15]#seq 10|awk 'NR>5 && NR<10'
#取 行间
6
7
8
9
[root@localhost ky15]#awk '$3>1000{print}' /etc/passwd
#注意分隔符
#打印出普通用户 第三列 大于1000 的行
算术操作符
x+y, x-y, x*y, x/y, x^y, x%y
-x:转换为负数
+x:将字符串转换为数值
比较操作符:
==, !=, >, >=, <, <=
#####逻辑
与:&&,并且关系
或:||,或者关系
非:!,取反

举例:/pat1/,/pat2/ 面试题 找到10:00 到 11:00 之间的日志
awk '/10/,/11/'  文件名
sed -nr '/10/,/11/p'   文件名

4.BEGIN 和END

  • 第一步:执行BEGIN{action;… }语句块中的语句
  • 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,
  • 从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
  • 第三步:当读至输入流末尾时,执行END{action;…}语句块
  • BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
  • END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块
  • pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块

 BEGIN:在打印所有命令之前先打印 -----

END:在打印所有命令之后再打印 -----

5.关系表达式

  • 非0为真,0为假

关系表达式打印奇数行

关系表达式打印偶数行

6.条件判断

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(判断条件){执行语句 

5、for | while

for(expr1;expr2;expr3) {statement;…}
for(variable assignment;condition;iteration process) {for-body}
for(var in array) {for-body}awk 'BEGIN{sum=0;for(i=1;i<=100;i++){sum+=i};print sum}'
5050for((i=1,sum=0;i<=100;i++));do let sum=i+sum;done;echo $sum
5050

6、数组

awk数组特性:

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

  • awk数组支持数组的数组

1.访问、赋值数组元素

arr[idx]
arr[idx] = value

索引可以是整数、负数、0、小数、字符串。如果是数值索引,会按照CONVFMT变量指定的格式先转换成字符串

2.遍历数组

统计LISTEN变量出现多少次

扩展一个

3。模糊匹配

7、awk脚本

[root@centos7 ~]#cat test.awk
#!/bin/awk -f     声明解释器
#this is a awk script
{if($3>=1000)print $1,$3}
[root@centos8 ~]#chmod +x test.awk
[root@centos8 ~]#./test.awk -F: /etc/passwd
nobody 65534
zhangsan 1000

练习:

提取下面的字段中的 IP地址和时间

vim test58.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

提取地址

host.txt主机名后再放回host.txt文件

vim host.txtwww.kgc.com
mail.kgc.com
ftp.kgc.com
linux.kgc.com
blog.kgc.com

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

共享的IP隔一段时间就变?用这种方法可以不需要知道电脑IP

前言 一般来说,电脑接入路由器之后,IP是由路由器自动分配的(DHCP),但如果隔一段时间不开机连接路由器,或者更换了别的网卡进行连接,自动分配的IP就会更改。 比如你手机连接着电脑的共享IP:192.168.1.10,但过段时间之后,电脑的IP突然变成了192.168.1.11,那么你的所有…

Qt+css绘制标题

之前学过html和小程序&#xff0c;帮老师做项目的时候也用过vue&#xff0c;在想qt绘制界面是不是也可以使用css,然后查了一些资料&#xff0c;绘制了一个标题&#xff0c;准备用到智能家居的上位机上面。 成果 源码 重写了paintEvent函数和TimeEvent函数&#xff0c;一个用于绘…

幻兽帕鲁服务器多少钱一个?26元,阿里云腾讯云华为云

2024年幻兽帕鲁服务器价格表更新&#xff0c;阿里云、腾讯云和华为云Palworld服务器报价大全&#xff0c;4核16G幻兽帕鲁专用服务器阿里云26元、腾讯云32元、华为云26元&#xff0c;阿腾云atengyun.com分享幻兽帕鲁服务器优惠价格表&#xff0c;多配置报价&#xff1a; 幻兽帕鲁…

透明拼接屏造型:多样拼接与影响因素

透明拼接屏&#xff0c;以其独特的透明显示效果和灵活的拼接方式&#xff0c;在现代显示领域中独树一帜。其造型多样&#xff0c;包括横屏拼接、竖屏拼接、异形拼接以及定制拼接等多种方式&#xff0c;满足了不同场景和应用的需求。尼伽小编将详细介绍这些拼接方式&#xff0c;…

PR转场模板|超级炫酷故障特效电影游戏视频转场PR模板剪辑素材

premiere转场&#xff0c;包含200个带有Sound FX的独特视频转场效果。加强剪辑视频视觉效果&#xff0c;在镜头之间的剪辑和添加文字动画&#xff01; MYFX Extension可帮助您一键浏览和应用预设&#xff01;可以喜爱预设&#xff0c;并拥有自己亲手挑选的库。如果您有任何问题…

字符数组的学习

前言&#xff1a; 在前面我们介绍过字符型数据是以字符的ASCII码储存在存储单元中&#xff0c;一般占一个字节&#xff0c;由于 ASCII码也属于整数类型&#xff0c;因此在C99标准中把字符类型归纳为整数类型中的一种&#xff0c;由于字符数据 的应用比较广泛&#xff0c;尤其…

抽象类(Java)、模板方法设计模式

一、概念 在Java中有abstract关键字&#xff0c;就是抽象的意思&#xff0c;可用来修饰类和成员方法。 用abstract来修饰类&#xff0c;那这个类就是抽象类&#xff1b;修饰方法&#xff0c;那这个方法就是抽象方法。 修饰符 abstract class 类名{修饰符 abstract 返回值类型…

【数据结构 02】队列

一、原理 队列通常是链表结构&#xff0c;只允许在一端进行数据插入&#xff0c;在另一端进行数据删除。 队列的特性是链式存储&#xff08;随机增删&#xff09;和先进先出&#xff08;FIFO&#xff1a;First In First Out&#xff09;。 队列的缺陷&#xff1a; 不支持随机…

看员工聊天记录,监控员工电脑聊天记录软件有哪些?

企业监控员工电脑聊天记录软件是指企业为了管理员工、提高工作效率和保护公司机密而采取的一种技术手段。随着互联网的发展和普及&#xff0c;员工在工作时间内使用聊天工具进行沟通已经成为常态&#xff0c;因此企业需要一种有效的方式来监控和管理员工的聊天记录。 为什么要监…

【算法与数据结构】198、213、337LeetCode打家劫舍I, II, III

文章目录 一、198、打家劫舍二、213、打家劫舍 II三、337、打家劫舍III三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、198、打家劫舍 思路分析&#xff1a;打家劫舍是动态规划的的经典题目。本题的难点在于递归公式…

机器学习 | 掌握线性回归的实战技巧

目录 初识线性回归 损失和优化 欠拟合与过拟合 正则化线性模型 模型的保存与加载 初识线性回归 线性回归(Linearregression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。特点是&#xff1a;有一个自变量的情况称为单…

代码随想录刷题笔记 DAY 18 | 找树左下角的值 No.513 | 路经总和 No.112 | 从中序与后序遍历序列构造二叉树 No.106

Day 18 01. 找树左下角的值&#xff08;No. 513&#xff09; 题目链接 代码随想录题解 1.1 题目 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 示例 2: 输入…

不移其志,踏浪前行 | 北京智和信通召开2023年度工作总结大会

岁聿云暮&#xff0c;新元肇启&#xff0c;2024年1月24日&#xff0c;北京智和信通技术有限公司&#xff08;以下简称“北京智和信通”&#xff09;召开2023年度年终总结大会。会上&#xff0c;各部门负责人全面分析公司业务发展态势&#xff0c;各部门员工依次汇报主要工作情况…

QT 使用 QWebChannel 与 Web 端通信展示文件信息

前言 本文将展示如何使用 QWebChannel 来实现 Web 端与 QT 端之间的交互&#xff0c;同时会通过一个在浏览器端展示文件夹信息的简单例子来展示其具体使用&#xff0c;其功能如下&#xff1a; 获取指定文件夹下的文件信息。通过使用 QT 的 QFileSystemWatcher 对指定文件夹进…

C语言 | 求最大/小值小技巧:fmax、fmin函数

如果你只是因为不想用C语言手写max、min函数&#xff0c;就直接去用iostream中的max、min函数的话&#xff0c;这篇文章可能会有些许帮助。 &#x1f607; fmax、fmin函数用于确定两个指定值的较大/较小值。 头文件 math.h&#xff08;或者cmath&#xff09;。 定义 double …

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷9

某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenStack搭建企业内部私有云平台&#xff0c;开源Kubernetes搭建云原生服务平台&#xff0c;选…

Android systemui 编译

目录 简介&#xff1a; 一、步骤 二、下载源码 三、环境配置 四、确定好需要编译版本 五、编译SystemUI 步骤1&#xff1a;进入源代码目录 步骤2&#xff1a;初始化编译环境 步骤3&#xff1a;选择目标设备 步骤4&#xff1a;编译SystemUI 步骤5&#xff1a;查找生成…

网络安全全栈培训笔记(59-服务攻防-中间件安全CVE复现lSApacheTomcataNginx)

第59天 服务攻防-中间件安全&CVE复现&lS&Apache&Tomcata&Nginx 知识点&#xff1a; 中间件及框架列表&#xff1a; lIS,Apache,Nginx,Tomcat,Docker,Weblogic,JBoos,WebSphere,Jenkins, GlassFish,Jira,Struts2,Laravel,Solr,Shiro,Thinkphp,Sprng,Flask,…

Ubuntu系统安装 Redis

环境准备 Ubuntu 系统版本&#xff1a;22.04.3Redis 版本&#xff1a;6.2.12 检查本地 make 环境 make -version若没有安装&#xff0c;则需要安装 sudo apt install make检查本地 gcc 环境 gcc -version若没有安装&#xff0c;则需要安装 sudo apt install gcc。 sudo a…

服装行业ERP系统解决方案

我国的服装企业大多属于劳动密集型&#xff0c;主要有三种类型&#xff1a;自有品牌服装生产销售企业、接订单生产型企业及处于产业链下游的零售分销企业。在经营过程中&#xff0c;服装行业面临诸多挑战&#xff0c;如流行周期短、季节性强&#xff0c;市场变化快&#xff1b;…