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

awk指令的详细指南

目录

工作原理

命令格式

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的下标。

 

 

相关文章:

awk指令的详细指南

目录 工作原理 命令格式 awk常见的内建变量&#xff08;可直接用&#xff09;如下所示 按行输出文本 按字段输出文本 通过管道、双引号调用 Shell 命令 示例 CPU使用率 数组 ​编辑统计文件的内容出现的次数 使用awk 统计secure 访问日志中每个客户端IP的出现次数? …...

解密Netty中的Reactor模式

文章目录 单线程Reactor模式多线程Reactor模式Reactor模式中IO事件的处理流程Netty中的通道ChannelNetty中的反应器ReactorNetty中的处理器HandlerNetty中的通道Channel和处理器Handler的协作组件Pipeline Reactor(反应器)模式是高性能网络编程在设计和架构方面的基础模式.Doug…...

这是一个黑科技:C++爬虫~(文末报名C/C++领域新星计划)

目录 写在前面 完整代码 这里必看!! 写在最后 写在前面 现在所有人都知道万能的Python可以做机器学习,可以做人工智能,可以爬取各种小网站,但是你不知道,基于C++的正则表达式早就能够爬取各种网络数据啦!!你没猜错,阿玥将在这篇文章中简介怎么用C...

2023 年第八届数维杯数学建模挑战赛 赛题浅析

为了更好地让大家本次数维杯比赛选题&#xff0c;我将对本次比赛的题目进行简要浅析。本次比赛的选题中&#xff0c;研究生、本科组请从A、B题中任选一个 完成答卷&#xff0c;专科组请从B、C题中任选一个完成答卷。这也暗示了本次比赛的难度为A>B>C 选题人数初步估计也…...

Spring Boot单元测试

什么是单元测试&#xff1f; 单元测试(unit testing)&#xff0c;是指对软件中的最小可测试单元进行检查和验证的过程就叫单元测试。 单元测试是开发人员编写的一小段代码&#xff0c;用于检验被测代码的一个很小的、很明确的(代码) 功能是否正确。执行单元测试就是为了证明某…...

实景三维浪潮翻涌,新技术“席卷”石家庄!

5月11日&#xff0c;“全自主、全流程、全覆盖”2023实景三维新技术研讨会石家庄站暨航测与遥感学术交流会在石家庄凯旋金悦大酒店圆满举行。 本次会议由中国测绘学会、中国地理信息产业协会指导&#xff0c;河北省测绘学会、河北省地理信息产业协会主办&#xff0c;武汉大势智…...

【Python】使用小脚本

本文整理了我在学习和工作中用到的实用python脚本&#xff0c;希望也能帮助到需要的小伙伴~ 文章目录 视频格式转换顺序遍历文件夹中的文件 视频格式转换 安装视频处理库moviepy pip install moviepy安装FFmpeg&#xff08;FFmpeg是一个开源的多媒体框架&#xff0c;moviepy…...

技术日志2023-5-18

1、Java远程调试 可参考&#xff1a;https://kefeng.wang/2018/03/06/idea-remote-debug/ 2、用户中心这样的基础项目有什么用&#xff0c;感觉非常鸡肋。 今天开发讨论中涉及到了用户中心&#xff0c;感觉在项目中使用用户中心只是给业务系统发一个token&#xff0c;业务系…...

JUC之锁

公平锁、非公平锁 公平锁指的是多线程按照申请锁的顺序来获取锁&#xff1b; 非公平锁指的是多线程不按照申请锁的顺序来获取锁。可能会出现优先级反转&#xff08;后者居上&#xff09; 公平锁为了保证线程申请顺序&#xff0c;势必要付出一定的性能代价&#xff0c;因此其吞…...

C++中的 cout 和 printf 用法

文章目录 前言cout & printfexampleprintf输出string字符串总结 前言 C是一种面向对象的编程语言&#xff0c;它继承了C语言的特点&#xff0c;同时也增加了许多新的特性。在C中的cout 和 printf是两种常用的输出函数&#xff0c;它们都可以将数据显示在屏幕上&#xff0c…...

Maven基础使用

Maven 学习目标 理解Maven的用途掌握Maven的基本操作掌握Maven如何创建Web项目 Maven是什么 面临问题 在学习Maven之前&#xff0c;我们先来看一下我们现在做的项目都有哪些问题。假设你现在做了一个crm的系统&#xff0c;项目中肯定要用到一些jar包&#xff0c;比如说myb…...

【C++ 入坑指南】(06)运算符

文章目录 一、算术运算符二、赋值运算符三、比较运算符四、逻辑运算符五、算法题5.1、拆分位数 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 内置了丰富的运算符&#xff0c;并提供了以下类型的运算符&#xff1a; 运算符类型作用算术运算符用于处理四则运算赋值…...

了解一下js中的函数式编程

js中的函数式编程是一种编程范式&#xff0c;它将函数作为一等公民来使用。 在函数式编程中&#xff0c;函数是一种特殊的对象&#xff0c;可以赋值给变量、作为参数传递给其他函数、或作为其他函数的返回值。 函数式编程强调了函数的纯函数性&#xff0c;即函数输入相同时&a…...

动态HTTP代理在linux里的使用

动态HTTP代理是一种可以自动切换代理IP地址的代理方式&#xff0c;可以有效地绕过一些限制访问的网站。在Linux系统中&#xff0c;可以使用Privoxy和Proxychains来实现动态HTTP代理。 以下是在Linux中使用动态HTTP代理的步骤&#xff1a; 1. 安装Privoxy和Proxychains 在终端中…...

软考证书值得考吗?怎么考?

软考证书是什么&#xff1f;有什么用处&#xff1f;必须先明确这两个问题&#xff0c;才能有复习和考取的动力。怎么考过&#xff1f;这是第二步要着重解决的问题。今天详细帮助大家分析一下。 软考是国家级考试&#xff0c;具有强大的权威性与公信力。 软考全称为计算机技术…...

超级秘密文件夹忘记密码的解决办法

超级秘密文件夹是一款非常特殊的文件夹加密软件&#xff0c;它来无影去无踪&#xff0c;在安装后不会留下任何痕迹&#xff0c;只能通过软件热键才能打开。那么如果在使用过程中忘记了密码&#xff0c;这时我们该怎么办呢&#xff1f;下面我们就来了解一下。 首先&#xff0c;我…...

脑的物理系统

⼤脑模块化 人脑是一个复杂的网络&#xff0c;一般将大脑划分为不同的区域&#xff08;即节点&#xff09;&#xff0c;并使用某种方法表征大脑区域之间的关系&#xff08;即连接的边&#xff09;来构建人脑网络。在功能磁共振成像&#xff08;fMRI&#xff09;数据的网络模型…...

1054. 距离相等的条形码(leetcode,堆问题,priority_queue)-------------------c++实现

1054. 距离相等的条形码&#xff08;leetcode,堆问题&#xff0c;priority_queue&#xff09;-------------------c实现 题目表述 在一个仓库里&#xff0c;有一排条形码&#xff0c;其中第 i 个条形码为 barcodes[i]。 请你重新排列这些条形码&#xff0c;使其中任意两个相…...

QT开发实战-动态壁纸软件

动态壁纸软件开发 项目源代码在下面链接获取: ----------------------------- 开发者:CodeSharkSJ 希望此项目能加强你对Qt的应用 文章目录 项目图与开发环境核心技术原理自定义窗口程序UI布局背景绘制样式表基本实现QWebEngineQMedia使用系统托盘隐藏记忆功能应用程序打包 …...

Netty核心组件模块(一)

1.Bootstrap和ServerBootstrap 1>.Bootstrap意思是引导,一个Netty应用通常由一个Bootstrap开始,主要作用是配置整个Netty程序,串联各个组件,Netty中Bootstrap类是客户端程序的启动引导类,ServerBootstrap是服务端启动引导类; 2>.常见的方法有: ①.public ServerBootstr…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...