详解AWK的用法

article/2025/9/22 12:56:10

Awk工具介绍

AwK是一种处理文本文件的语言,是一个强大的文本分析工具。
它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作。数据可以来自标准输入也可以是管道或文件
20世纪70年代诞生于贝尔实验室,现在centos7用的是gawk

工作原理:

Awk逐行读取文件,默认以空格为分隔符进行分隔。
当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出。
如果没有定义匹配条件默认是匹配所有数据行,awk隐含循环,条件匹配多少次动作就会执行多少次。

格式: awk 选项 '模式或条件 {编辑指令} ’ 文件
awk -f 脚本文件

在 Awk语句中,模式部分决定何时对数据进行操作,若省略则后续动作时刻保持执行状态,模式可以为条件语句、复合语句或正则表达式等。每条编辑指令可以包含多条语句,多条语句之间要使用分号或者空格分隔的多个{}区域。常用选项-F定义字段分隔符,默认以空格或者制表符作为分隔符。
Awk提供了很多内置变量,经常用于处理文本,了解这些内置变量的使用是很有必要的,如下表
在这里插入图片描述

按字段输出文本

awk '{print}' a.test       输出所有内容,等同于cat test.txt
awk '{print $0}' a.test    输出所有内容,等同于cat test.txt
awk '{print $1}'  a.test   打印第一列//awk默认把一行当做一列,如果没有指定分隔符,默认以空格或tab键分隔
awk -F: '{print $5}' a.test   指定“:”为分隔符,打印第5列的内容
awk -Fx '{print $1}' a.test           指定“x”为分隔符,打印第1列的内容
awk '{print $1" " $2 }' a.test        //显示一个空格,空格需要用双引号引起来,如果不用引号默认以变量看待,如果是常量就需要双引号引起来
awk '{print $1,$2 }' a.test          //逗号有空格效果
awk -F: '{print $1"---"$2}' a.test   //第一列和第二列内容以"---"间隔
awk -F: '{print "用户名"$1"的uid是"$3}' a.test  常量以用""引起来
awk -F: '{print $0}'  a.test       处理整行内容      
awk -F[:/] '{print $2}' a.test     //定义多个分隔符,只要看到其中一个都算作分隔符
awk -F: '{print NF}'  a.test         打印每行有多少列
wk '{print $3}' test.txt	输出每行中(以空格或制表位分隔)的第 3 个字段
awk '{print $1,$3}' test.txt	输出每行中的第 1、3 个字段
awk -F: '$2=="!!"{print}' /etc/shadow 	'输出密码为空的用户的shadow 记录'
awk 'BEGIN {FS=":"}; $2=="!!"{print}' /etc/shadow		'输出密码为空的用户的shadow 记录awk -F: '$7~"/bash"{print $1}' /etc/passwd		'输出以冒号分隔且第 7 个字段中包含/bash 的行的第 1 个字段'
awk '($1~"nfs")&&(NF==8){print $1,$2}' /etc/services	'输出包含 8 个字段且第 1 个字段中包含 nfs 的行的第 1、2 个字段'
awk -F: '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd	'输出第 7 个字段既不为/bin/bash 也不为/sbin/nologin 的所有行

按行输出文本

awk '{print}' test.txt 		'输出所有内容,等同于cat test.txt'
awk '{print $0}' test.txt 		'输出所有内容,等同于cat test.txt'
awk 'NR==1,NR==3{print}' test.txt 		'输出第1~3行内容'
awk '(NR>=1)&&(NR<=3){print}' test.txt 		'输出第1~3行内容'
awk 'NR==1||NR==3{print}' test.txt 		'输出1行,第3行内容'
awk '(NR%2)==1{print}' test.txt 		'输出所有奇数行内容'
awk '(NR%2)==0{print}' test.txt 		'输出所有偶数行内容'
awk '/^root/{print}' /etc/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 '
awk 'BEGIN{RS=""};END{print NR}' /etc/squid/squid.conf  	'统计以空行分隔的文本段落数'
awk -F: '/root/{print $0}'  a.test     包含root的行
awk -F: '/root/{print $1}'  a.test     包含root的行的第一列
awk -F: '/root/{print $1,$6}'  a.test  包含root的行第一列和第六列 
awk -F: '{print NF}'  a.test            显示每一行的列数
awk -F[:/]  '{print NR}'  a.test        显示行号
awk -F: '{print NR,$0}'  a.test         打印文本内容并显示行号
awk 'NR==2'  /etc/passwd                打印第二行,不加print也一样,默认就是打印
awk -F: 'NR==2{print $1}'  /etc/passwd  打印第二行第一列内容
awk 'END {print NR}'  /etc/passwd       打印总行数
awk 'END{print $0}'  /etc/passwd        打印文件最后一行内容
awk -F: '$1=="ntp"{print NR,$0}'  /etc/shadow   打印第一列内容为ntp的行,并显示行号
awk -F: '{print "第"NR"行有"NF"列"}' /etc/passwd   //第几行有几列

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

(1)操作命令放在{}中

(2)管道符号前面的命令输出的内容交给管道符号后面的命令处理

(3)结合正则表达式,正则表达式同样要被包围

(4)调用的shell命令需要用""引起来

(5){}中多个命令之间用;分隔

awk -F: '/bash$/{print | "wc -l"}' /etc/passwd  '调用wc -l 命令统计以bash结尾的用户个数,等同于 grep -c "bash$" /etc/passwd '
awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}'  '调用w 命令,并用来统计在线用户数'
ifconfig ens33 | awk '/netmask/{print "本机的ip地址是"$2}' ens33网卡的ip地址
df -h | awk 'NR==2{print $4}'                            根分区的可用量

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

awk的运算

awk 'BEGIN{x=10;print x}'  
awk 'BEGIN{x=10;print x+1}'
awk 'BEGIN{x=10;x++;print x}'
awk 'BEGIN{print x+1}'           //不指定初始值,初始值就为0,如果是字符串,则默认为空
awk 'BEGIN{print 2.5+3.5}'      //小数也可以运算
awk 'BEGIN{print 2^3}'         //^和**都是幂运算

模糊匹配

awk -F: '$1~/ro/'  /etc/passwd   //模糊匹配,只要有ro就匹配上,用~表示包含
awk -F: '$7!~/nologin$/{print $1,$7}' a.test 第七列不包含nologin结尾的第一行和第七行

数值与字符串的比较
比较符号:== != <= >= < >

awk 'NR<5'  a.test   打印文件前四行
awk -F: '$3==0'  /etc/passwd  文件第三列等于0的行
awk -F: '$1=="root"{print}' /etc/passwd    文件第一列是root的行

逻辑运算 && ||

awk -F: '$3>10 && $3<1000'  /etc/passwd 
awk -F: '$3<10 || $3>=1000'  /etc/passwd 
seq 200 | awk '$1%7==0 && $1~/7/'  打印1-200之间所有能被7整除并且包含数字7的整数数字

其他内置变量的用法FS、OFS、NR、FNR、RS、ORS

awk 'BEGIN{FS=":"}{print $1}'  a.test  //在打印之前定义字段分隔符为冒号
awk 'BEGIN{FS=":";OFS="XXX"}{print $1,$2}' a.test  //OFS定义了输出时以什么分隔,$1$2中间要用逗号分隔,因为逗号默认被映射为OFS变量,而这个变量默认是空格
awk 'BEGIN{RS=":"}{print $0}' /etc/passwd  //RS:指定以什么为换行符,这里指定是冒号
awk 'BEGIN{ORS="aaa"}{print $0}'  a.test     定义以什么连接行
awk 'BEGIN{ORS=" "}{print $0}' /etc/passwd   //把多行合并成一行输出,输出的时候自定义以空格分隔每行,本来默认的是回车键

awk高级用法

定义引用变量

a=100
awk -v b="$a"  'BEGIN{print b}'   //将系统的变量a,在awk里赋值为变量b,然后调用变量b
awk 'BEGIN{print "'$a'"}'         /直接调用的话需要先用双引号再用单引号
awk -vc=1000 'BEGIN{print c}'      //awk直接定义变量并引用
1

调用函数getline,读取一行数据的时候并不是得到当前行而是当前行的下一行

seq 10 | awk '{getline;print $0}'    //显示偶数行
seq 10 | awk '{print $0;getline}'    //显示奇数行

awk的if语句也分为单分支、双分支和多分支

单分支为if(){}
双分支为 if(){}} else{}
多分支为if(){} else if(){} else{}

awk -F: '{if($3<10){print $0}}'  /etc/passwd   //第三列小于10的打印整行
awk -F: '{if($3<10){print $3} else {print $1}}' /etc/passwd //第三列小于10的打印第三列,否则打印第一列

awk命令总结

(1)一般输出关于段,列的信息使用awk,其他的使用sed或grep更加方便

(2)awk输出的奇偶行都使用绝对路径

(3)sed输出的奇偶行都使用相对路径

(4)使用awk调用shell命令,统计数量时,n是个变量,可自定义

(5)若没有定义n的初始值,则n=0

(6)awk判断条件中双引号之间的内容,如果有特殊符号不需要使用转义符

(6)FS在{}中间使用,F在{}外面使用


http://chatgpt.dhexx.cn/article/ohTlHuMd.shtml

相关文章

Shell脚本文本三剑客之AWK

目录 一、AWK工具介绍 1.1AWK命令的基本格式 1.2AWK工作原理 1.3常见的内建变量&#xff08;可直接用&#xff09; 二、实例 2.1打印文本内容 案例1&#xff1a;打印磁盘已经使用情况 案例2:打印字符串 案例3&#xff1a;打印字符串确定文件有多少行 2.2根据$n提取字…

AWK常用技巧

1.1 介绍 awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言&#xff1a; AWK 程序设计语言 &#xff0c; 三位创建者已将它正式定义为“样式扫描和处理语言”。 它允许您创建简短的程序&#xff…

AWK用法全解

一、awk介绍 awk是Linux自带的一个逐行扫描的文本处理工具&#xff0c;支持正则表达式、循环控制、条件判断、格式化输出。AWK自身带有一些变量&#xff0c;可以在书写脚本时调用。 二、基本语法格式 2.1、在shell中使用awk awk [option] 代码块 文件名 option的选项及含义…

awk文本工具

awk 一、什么是awk&#xff1f;二、awk的工作原理三、命令格式四、管道符号调用四、getline 一、什么是awk&#xff1f; awk命令是一种编程语言&#xff0c;用于在linux/unix下对文本和数据进行处理。 而且它支持用户自定义函数和动态正则表达式等先进功能&#xff0c;是linux…

shell之三剑客awk(基础用法)

文章目录 一、awk概述1、awk工作原理 二、awk的格式三、内置变量演示1、【$n】进行演示2、【$0】的演示3、【NF】(多少列) 和 【NR】(多少行)的演示4、面试题5、BEGIN开始和END结尾6、模糊匹配7、关于数值与字符串的比较 四、总结 一、awk概述 AWK是一种处理文本文件的语言&am…

《J2EE 学习笔记 之 idea 搭建 SSM 项目》

J2EE 学习笔记 之 idea 搭建 SSM 项目 详细步骤 step1 step2 step3 step4 step5

对于J2EE体系架构的理解

一、何为J2EE&#xff1f; J2EE架构是使用Java技术开发企业级应用的一种事实上的工业标准&#xff0c;它是Java技术不断适应和促进企业级应用过程中的产物。Java平台有三个版本&#xff1a;适用于小型设备和智能卡的J2ME(Java 2 Platform Micro Edition)、适用于桌面系统的J2S…

idea创建j2ee_IntelliJ IDEA 创建J2EE项目

IntelliJ IDEA 创建J2EE项目 方式一 1.File--NewProject--next&#xff0c;取个名字&#xff0c;意味着你的文件存放地。 2.Next--Next--勾选Web Application--Finish。 3.Edit Configurations--添加--tomcat--local--找到WEB容器所地 4.&#xff2f;&#xff2b;&#xff0c;这…

J2EE总结

1.J2EE介绍 1.企业级java简史 一.Java版本 (1)J2ME,功能非常有限&#xff0c;用于嵌入式设备 (2)J2SE包含原始的核心类库&#xff0c;用于桌面应用程序和浏览器中的Applet (3)J2EE&#xff0c;功能非常全面&#xff0c;用于数据处理和服务器端应用 二.对现有和新技术的继承&…

关于J2ee

学习完j2se&#xff0c;对Java有了大概的了解&#xff0c;但是对接下来要学习的j2ee却有点囧&#xff0c;因为从概念里也get不到它到底是个什么东西&#xff01;so&#xff0c;从整体看j2ee&#xff0c;让百度告诉我答案。 Java2平台&#xff08;1998年12月&#xff0c;SUN公司…

J2EE架构简介

J2EE 体系结构简介 J2EE &#xff08;Java 2 Platform, Enterprise Edition&#xff09;即Java2平台企业版&#xff0c;它提供了基于组件的方式来设计、开发、组装和部署企业应用。J2EE使用多层分布式的应用模型&#xff0c;这个多层通常通过三层或四层来实现&#xff1a; ①客…

概览J2EE

J2EE是一种基于组件与平台无关的技术架构。 J2EE核心是一组技术规范和指南&#xff0c;包含各类的组件、服务架构、以及技术层次。 一、 J2EE的体系结构 先来看一些概念&#xff1a; 1、组件&#xff1a;是提供业务服务的独立功能单元&#xff0c;易操作&#xff0c;属性和实…

J2EE 全面简介

J2EE 全面简介 刘湛 (jeru@163.net) 武汉大学信息与计算科学系学士2001 年 7 月 本文从五个方面对J2EE进行了比较全面的介绍。从J2EE的概念说起,到它的优势,到J2EE典型的四层模型,和它的框架结构,最后是J2EE十三种核心技术的一个简介。本文分门别类的对J2EE中的服务,组件,…

自己搭建一个局域网(两台电脑)

1.首先保证两台电脑都有联网 2.更改适配器把两台电脑设为固定IP,同时让分配的IP地址相邻 3.使用ping命令&#xff0c;看是否能ping通。是&#xff0c;创建完成。否&#xff0c;有问题&#xff0c;重新分配固定IP后尝试。 哎&#xff0c;学校固定IP好像还要申请&#xff0c;哈哈…

如何用笔记本创建局域网

怎么用笔记本创建局域网呢&#xff1f;会不会很难&#xff1f; 现在教一个简单的方法创建局域网。 1、首先使用快捷键“WinR”打开cmd。 2、接着在弹出的窗口输入netsh wlan set hostednetwork modeallow ssid(这里输入你想给你局域网起的名字) key(这里输入自己设定的密码)&…

搭建小型局域网

Packet Tracer 是 Cisco 公司针对 CCNA 认证开发的一个用来设计、配置和故障排除网络的模拟软件。Packer Tracer 模拟器软件比 Boson 功能强大&#xff0c;比 Dynamips 操作简单&#xff0c;非常适合网络设备初学者使用。 学习任务 1、安装 Packer Tracer&#xff1b; 2、利用…

局域网组建

(1)回答问题&#xff1a;要想为计算机分配IP地址&#xff0c;必须要安装什么协议&#xff1f; 肯定是TCP/IP协议,安装及分配IP地址方法如下。按下面路径:控制面板》网络和 Internet》网络和共享中心》更改适配器设置》找到本地连接》右键属性&#xff0c;然后 1&#xff09; 添…

不同局域网内进行网络连接的建立方法

前言 在这互联网和物联网的时代&#xff0c;网络连接与通信被使用的越来越多&#xff0c;如何建立两个网络IP地址的连接 &#xff08;TCP或者UDP连接&#xff09;&#xff0c;也是一门学问。之前项目中遇到了这方面的问题&#xff0c;也被纠缠了一番&#xff0c;查阅大量资料&…

企业局域网的组建步骤和方法

什么是局域网&#xff1f;所谓的局域网(Local Area Network&#xff0c;简称LAN)&#xff0c;用于将有限范围内&#xff08;例如一个实验室、一层办公楼或者校园&#xff09;的各种计算机、终端与外部设备互联成网。企业局域网怎么建立&#xff1f;首先来了解下不同规模企业网络…

建立局域网的条件

建立局域网的条件 我的意思是硬件方面&#xff0c;比如说2台电脑连接在一个路由器上&#xff0c;那么可以通过设置来建立局域网吗&#xff1f;要是想并联多台电脑的话。。。还需要什么硬件来建立局域网&#xff1f;谢谢高人帮助 建立局域网&#xff0c;如果2113不上网的话&…