awk指令的详细指南

news2024/11/29 1:32:06

目录

工作原理

命令格式

awk常见的内建变量(可直接用)如下所示

按行输出文本

 按字段输出文本

通过管道、双引号调用 Shell 命令

示例

CPU使用率

数组

​编辑统计文件的内容出现的次数

使用awk 统计secure 访问日志中每个客户端IP的出现次数?


工作原理

逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量

中,并按模式或者条件执行编辑命令。

sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再进行处理。awk信息

的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过

程中,可以使用逻辑操作符“&&”表示“与”、“||”表示“或”、“!”表示“非”;还可以进行简单的数学运算,

如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。

命令格式

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

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

awk常见的内建变量(可直接用)如下所示

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


按行输出文本

awk '{print}' a.txt               #输出所有内容

awk '{print $0}' a.txt                 #输出所有内容

awk 'NR==1,NR==3{print}' a.txt        #输出第 1~3 行内容


awk '(NR>=1)&&(NR<=3){print}' a.txt     #输出第 1~3 行内容

awk 'NR==1||NR==3{print}'a.txt     #输出第1行、第3行内容

awk '(NR%2)==1{print}' a.txt          #输出所有奇数行的内容

awk '(NR%2)==0{print}' a.txt       #输出所有偶数行的内容

 awk '/^root/{print}' passwd        #输出以 root 开头的行

 awk '/nologin$/{print}' /etc/passwd        #输出以 nologin 结尾的行

awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd        #统计以/bin/bash 结尾的行数,等同于 grep -c "/bin/bash$" /etc/passwd


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

 按字段输出文本

awk -F ":" '{print $3}' passwd         #输出每行中(以空格或制表位分隔)的第3个字段

 awk -F ":" '{print $1,$3}' passwd        #输出每行中的第1、3个字段

 awk -F ":" '$3<5{print $1,$3}' passwd    #输出第3个字段的值小于5的第1、3个字段内容

 awk -F ":" '!($3<200){print}' passwd     #输出第3个字段的值不小于200的行

awk 'BEGIN {FS=":"};{if($3>=1000){print}}' passwd    #先处理完BEGIN的内容,再打印文本里面的内容

 awk -F ":" '{max=($3>=$4)?$3:$4;{print max}}' passwd        #($3>$4)?$3:$4;三元运算符,如果第3个字段的值大于等于第4个字段的值,则把第3个字段的值赋给max,否则第4个字段的值赋给max

 awk -F ":" '{print NR,$0}' passwd        #输出每行内容和行号,每处理完一条记录,NR值加1

 awk -F ":" '$7~"/bash"{print $1}' passwd    #输出以冒号分隔且第7个字段中包含/bash的行的第1个字段

 awk -F ":" '($1~"root")&&(NF==7){print $1,$2}' passwd    #输出第1个字段中包含root且有7个字段的行的第1、2个字段

awk -F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' passwd    #输出第7个字段既不为/bin/bash,也不为/sbin/nologin的所有行


通过管道、双引号调用 Shell 命令

echo $PATH | awk 'BEGIN{RS=":"};END{print NR}'        #统计以冒号分隔的文本段落数,END{}语句块中,往往会放入打印结果等语句

 awk -F: '/bash$/{print | "wc -l"}' passwd        #调用 wc -l 命令统计使用 bash 的用户个数,等同于 grep -c "bash$" /etc/passwd

 free -m | awk '/Mem:/ {print $3/$2 * 100"%"}'   #查看当前内存使用百分比

top -b -n 1 | grep Cpu | awk -F ',' '{print $4}' | awk '{print $1}'        #查看当前CPU空闲率,(-b -n 1 表示只需要1次的输出结果)

date -d "$(awk -F "." '{print $1}' /proc/uptime) second ago" +"%F %H:%M:%S"        #显示上次系统重启时间,等同于uptime;second ago为显示多少秒前的时间,+"%F %H:%M:%S"等同于+"%Y-%m-%d %H:%M:%S"的时间格式

/proc/uptime 第一列输出的是,系统启动到现在的时间(以秒为单位);第二列输出的是,系统空闲的时间(以秒为单位)

date -d "$(date -d"1 month" +"%Y%m01") -3 day" +"%Y%m%d"  当月倒数第三天
date +"%Y%m01"        当月第一天

 

 awk 'BEGIN {n=0 ; while ("w" | getline) n++ ; {print n-2}}'    #调用w命令,并用来统计在线用户数

awk 'BEGIN {"hostname" | getline ; {print $0}}'            #调用 hostname,并输出当前的主机名

seq 10 | awk '{getline; print $0}'      #获取偶数行


seq 10 | awk '{print $0; getline}'      #获取奇数行

当getline左右无重定向符“<”或“|”时,awk首先读取到了第一行,就是1,然后getline,就得到了1下面的第二行,就是2,因为getline之后,awk会改变对应的NF,NR,FNR和$0等内部变量,所以此时的$0的值就不再是1,而是2了,然后将它打印出来。
当getline左右有重定向符“<”或“|”时,getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。

FNR:awk当前读取的记录数,其变量值小于等于NR(比如当读取第二个文件时,FNR是从0开始重新计数,而NR不会)。
NR==FNR:用于在读取两个或两个以上的文件时,判断是不是在读取第一个文件

示例

CPU使用率

cpu_us=`top -b -n 1 | grep Cpu | awk '{print $2}' `

cpu_sum=$(($cpu_us+$cpu_sy))

echo $cpu_sum

echo "A B C D" | awk '{OFS="|";print $0;$1=$1;print $0}'

 A B C D
 A|B|C|D

$1=$1 是用来激活$0的重新赋值,也就是说 字段$1...和字段数NF的改变会促使awk重新计算$0的

值,通常是在改变OFS后而需要输出$0时这样做

数组

awk 'BEGIN{a[0]=10;a[1]=20; print a[1]}'

awk 'BEGIN{a[0]=10;a[1]=20; print a[0}}'

awk 'BEGIN{a["abc"]=10;a["xyz"]=20;print a["abc"]}'

awk 'BEGIN{a["abc"]=10;a["xyz"]=20;print a["xyz"]}'

awk 'BEGIN{a["abc"]="aabbcc";a["xyz"]="xxyyzz";print a["xyz"]}'

awk 'BEGIN{a[0]=10;a[1]=20;a[2]=30;for(i in a){print i,a[i]}}' 

PS1:BEGIN中的命令只执行一次
PS2:awk数组的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号

统计文件的内容出现的次数

cat test.txt
aaa
aaa
bbb
ccc
aaa
bbb
aaa

awk '{a[1]++}END{for(i in a){print a[i]}}' test.txt


PS:a[1]初始为0,a[1]++后即为1,而这里awk中的a[1]++最终的值是由test.txt文本内容有多少行决定的,文本逐行读取完毕后再执行END中的命令

使用awk 统计secure 访问日志中每个客户端IP的出现次数?

cat /var/log/secure | awk '/Failed password/{a[$11]++};END{for(i in a){print i,a[i]}}'

备注:定义数组,数组名称为ip,数字的下标为日志文件的第1列(也就是客户端的IР地址),++的目的在于对客户端进行统计计数,客户端IP出现一次计数器就加1。END中的指令在读取完文件后执行,通过循环将所有统计信息输出,for循环遍历的是数组名ip的下标。

 

 

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

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

相关文章

云上的二维设计原来是这样的!

今天与大家探索云上的二维设计&#xff0c;3DEXPERIENCE DraftSight基于云平台实现与云端进行连接&#xff0c;实现一定的云上协作&#xff0c;提升绘图工作效率&#xff0c;我们从以下三方面来进行说明&#xff1a; 01&#xff1a;DraftSight设计 02&#xff1a;Revision变更…

ECharts 快速入门

文章目录 1.1 ECharts介绍1.2 vue使用ECharts1&#xff09;vscode打开测试工程2) 工程安装echarts依赖3) 配置echarts4) vue组件使用echarts5) 页面效果&#xff1a; 1.3 项目中 ECharts 的使用1) 配置和使用流程说明2) 前端显示效果 1.1 ECharts介绍 ECharts是百度开发的一个…

JavaScript 循环方法

JavaScript 循环方法 不涉及到具体绑定到 prototype 上的循环方式&#xff0c;即 XXXXX.prototype 中包含的循环方式&#xff08;如 forEach, map&#xff09;。 for for 总共有三种循环方式&#xff0c;一个是传统的 for 循环体&#xff0c;一个是 for in&#xff0c;还有一…

微信最新版本解除【文件只读】

问题 某一天开始&#xff0c;微信自动升级到3.9版本&#xff0c;最大的改变就是接收到的文件是只读属性&#xff0c;网上目前有两个办法&#xff0c;1.降到3.8甚至更早版&#xff1b;2.将version.dll补丁文件复制到微信安装目录&#xff0c;但3.9.2版本就不能用了。 解决办法…

软件测试之测试用例的设计

1. 测试用例的概念 软件测试人员向被测试系统提供的一组数据的集合&#xff0c;包括 测试环境、测试步骤、测试数据、预期结果 2. 为什么在测试前要设计测试用例 测试用例是执行测试的依据 在回归测试的时候可以进行复用 是自动化测试编写测试脚本的依据 衡量需求的覆盖率…

完全了解FPC柔性电路板,生产到市场全讲解

1.什么是FPC 随着社会的不断进步&#xff0c;电子行业的不断更新换代&#xff0c;传统的PCB已经不能满足所有电子产品的需求&#xff0c;FPC的市场需求也越来越大&#xff0c;有很多朋友还不是很清楚FPC是什么&#xff0c;下面来简单的介绍一下: FPC全称&#xff1a;柔性印制电…

利用Springboot来驱动开发桌面程序

众所周知&#xff0c;SpringBoot是一款强大的Javaweb开发程序&#xff0c;这得益于其构造了一个Spring容器&#xff0c;然后通过依赖注入和控制反转&#xff0c;维护起一套Java对象和实例的管理机制&#xff0c;方便开发者去使用。在web应用开发的应用中&#xff0c;Springboot…

python 的垃圾回收机制

一、 引入 python解释器在执行到定义变量的语法时&#xff0c;会申请内存空间来存放变量的值&#xff0c;而内存的容量是有限的&#xff0c;这就涉及到变量值所占用内存空间的回收问题&#xff0c;当一个变量值没有用了&#xff08;简称垃圾&#xff09;就应该将其占用的内存给…

【Linux】IO多路转接-poll

文章目录 I/O多路转接-pollpoll初识poll函数poll的小测试-监控标准输入poll服务器poll_server.cc poll的优点poll的缺点 I/O多路转接-poll poll初识 poll也是系统提供的一个多路转接接口, poll系统调用也可以让我们的程序同时监视多个文件描述符上的事件是否就绪,和select的定…

DDos攻击概述

1.def&#xff1a; 通过大规模互联网流量淹没目标服务器或其周边基础设施&#xff0c;以破坏目标服务器、服务或网络正常流量的恶意行为 目标服务器类比作商店&#xff1b; 网络的正常流量类比作顾客&#xff1b; 此恶意行为便相当于让一堆小混混装成正常顾客涌入商店&…

软件自动化测试有什么优势?自动化测试框架有哪些?

一、 软件自动化测试的优势 在软件测试过程中&#xff0c;自动化测试不断被提高到更高的级别&#xff0c;以提高测试效率以及降低测试成本。 1.节省时间和成本 手动测试需要耗费大量的时间和精力&#xff0c;而自动化测试可以在较短时间内执行多次测试&#xff0c;并且可以在…

Alibaba Sentinel整合SpringBoot,为微服务保驾护航!

前言 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来…

08-05 应用层设计

伸缩性的架构设计——服务器集群的伸缩性 DNS负载均衡 DNS服务器将访问的域名转发到对应的网关&#xff0c;网关层做反向代理。 利用消息组件对业务场景进行解耦 适合用消息组件解耦的场景 长任务&#xff08;时间长&#xff0c;逻辑复杂&#xff0c;可异步&#xff09…

React Antv G2Plot 「指标拆解图」 前端可视化实战 实现渲染、重置、筛选功能

背景 实现对指定数据的「指标拆解图」 渲染&#xff0c;并且可以根据筛选项进行变化。 任务分解 antv 的图表&#xff0c;以及请求后端的载荷对传入的数据结构有严格要求 一个工具函数将后端接口返回的数据格式化成 antv 图表要求的格式一个工具函数将前端提交的请求数据格…

Copilot入门

文章目录 简介安装初试快捷键取消订阅参考文献 简介 Copilot 是一款 GitHub 和 OpenAI 合作开发的 AI 结对编程工具&#xff0c;支持 Visual Studio、Neovim、VS Code、JetBrains IDEs&#xff0c;用于自动补全代码。 本文以 Python PyCharm 为例。 安装 GitHub Copilot&am…

【数据结构】栈及其实现

目录 &#x1f920;前言 什么是栈&#xff1f; 栈的定义及初始化 栈的定义 栈的初始化 栈的判空 栈顶压栈 栈顶出栈 栈的数据个数 栈的销毁 完整代码 总结 &#x1f920;前言 学了相当长一段时间的链表&#xff0c;总算是跨过了一个阶段。从今天开始我们将进入栈和…

什么是AIGC

AIGC是人工智能创意生成的缩写&#xff08;Artificial Intelligence Generated Creativity&#xff09;&#xff0c;指的是利用人工智能技术实现的创意生成。通俗来说&#xff0c;就是让机器产生新颖、独特且有创造性的作品或方案&#xff0c;例如音乐、绘画、视频、文本等等。…

Sui基金会宣布面向APAC的Office Hours计划

诚挚邀请构建者与Sui基金会的Growth团队一起开启“Office Hours”计划&#xff0c;共同努力&#xff0c;迈向业务增长的下一步。 Sui基金会致力于推动Sui在全球范围内的普及。为此&#xff0c;我们通过积极支持开发人员的开发者资助计划、Builder House和大使计划在Sui上开始…

如何高效运行Omniverse,无惧本地硬件压力

无论是创造能够表达原始情感的逼真数字人&#xff0c;还是构建身临其境的虚拟世界&#xff0c;全球设计、工程、创意和其他行业的人士都在通过3D工作流&#xff0c;突破技术壁垒并拓展创意可能&#xff0c;让虚拟世界和现实世界交融与观众产生共鸣。 而在众多连接未来创作内容的…

ES6中函数新增的方式方法

1.1函数形参的默认值 1.1.1基本用法 ES6 之前&#xff0c;不能直接为函数的参数指定默认值&#xff0c;只能采用变通的方法。如下代码&#xff1a; function func(x,y){y y || "tom";console.log(x,y);}func("hello"); //hello tomfunc("…