Shell脚本文本三剑客之AWK

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

目录

一、AWK工具介绍

1.1AWK命令的基本格式

1.2AWK工作原理

1.3常见的内建变量(可直接用)

二、实例

2.1打印文本内容

案例1:打印磁盘已经使用情况

案例2:打印字符串

案例3:打印字符串确定文件有多少行

2.2根据$n提取字段

案例1:提取ip地址

案例2:提取mac地址

2.3根据选项-F指定分隔符

案例1:打印/etc/passwd所有用户名

案例2:打印多列内容

案例3:打印磁盘已经使用情况,去除%

案例4:取出文本中的ip地址及时间

案例5:取出文本中的主机并放回

2.4根据关键字提取所在行

案例1:提取/etc/passwd 以root开头的行

案例2:提取/etc/passwd root所在的行

案例3:提取/etc/passwd nologin结尾的行

案例4:提取ip地址

2.5 使用BEGIN输出包含指定字符的行并统计有多行

2.6 FS∶ 列分割符提取列

2.7NF∶

案例1:当前处理的行的字段个数

案例2:打印出每行最后一个字段

案例3:打印出每行倒数第二个字段

2.8 NR:

案例1: 当前处理的行的行号

案例2:NR==n代表行号等于什么

案例3:NR%2==0取偶数行

案例4:NR%2==1取奇数行

案例5:NR==1,NR==4取区间行

案例5:取UID数值范围$n>1000

三、牛刀小试

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

2.提取主机名并放入原文件

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

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


一、AWK工具介绍

  • AWK 是一种处理文本文件的语言,是一个强大的文本分析工具

  • 可以在无交互的模式下实现复杂的文本操作

  • 相较于sed常作用于一整个行的处理,awk则比较倾向于一行当中分成数个字段来处理,因为awk相当适合小型的文本数据。

1.1AWK命令的基本格式

awk [选项] ‘模式条件{操作}’ 文件1 文件2...
awk -f|-v 脚本文件 文件1 文件.....

1.2AWK工作原理

  • 前面提到sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个"字段"然后再进行处理,且默认情况下字段的分隔符为空格或tab键awk 执行结果可以通过print的功能将字段数据打印显示。

  • 在使用awk命令的过程中,可以使用逻辑操作符"&&“表示"与”、"“表示"或”、"!“表示"非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。

  • awk后面接两个单引号并加上大括号{ }来设置想要对数据进行的处理操作,awk可以处理后续接的文件,也可以读取来自前个命令的标准输。

1.3常见的内建变量(可直接用)

  • FS∶ 列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同

  • NF∶ 当前处理的行的字段个数。

  • NR∶ 当前处理的行的行号(序数)。

  • $0∶当前处理的行的整行内容。

  • $n∶ 当前处理行的第n个字段(第n列)。

  • FILENAME∶ 被处理的文件名。

  • RS∶ 行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是’\n’

二、实例

2.1打印文本内容

  • awk可以将自动将多个空格压缩成一个空格

  • 打印字符串需要加双引号

案例1:打印磁盘已经使用情况

[root@localhost ~]#df |awk '{print $5}'
已用%
8%
0%
0%
3%
0%
18%
1%
1%
100%

案例2:打印字符串

[root@localhost ~]#awk '{print "hello"}'
1
hello
2
hello
3
hello

案例3:打印字符串确定文件有多少行

[root@localhost ~]#awk '{print "hello"}' /etc/fstab 
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
[root@localhost ~]#awk '{print "hello"}' /etc/fstab |wc -l
12
[root@localhost ~]#cat /etc/fstab |wc -l
12

2.2根据$n提取字段

案例1:提取ip地址

$n,代表提取第几列

#法一
[root@localhost ~]#ifconfig ens33|sed -n '2p'|awk '{print $2}'
192.168.59.102

案例2:提取mac地址

[root@localhost ~]#ifconfig ens33|sed -n '4p' |awk '{print $2}'
00:0c:29:3e:22:fe

2.3根据选项-F指定分隔符

案例1:打印/etc/passwd所有用户名

[root@localhost ~]#cat /etc/passwd|awk -F":" '{print $1}'
root
bin
daemon
adm
lp
sync
###########后面省略######

案例2:打印多列内容

打印时逗号可以表示空格,如果使用“:”或者“+”,需要将特殊符号加上双引号当成字符串打印

=[root@localhost ~]#cat /etc/passwd|awk -F":" '{print $1,$2}'
root x
bin x
daemon x
###########后面省略######[root@localhost ~]#cat /etc/passwd|awk -F":" '{print $1":"$2}'
root:x
bin:x
daemon:x
adm:x
###########后面省略######[root@localhost ~]#cat /etc/passwd|awk -F":" '{print $1"+"$2}'
root+x
bin+x
daemon+x
###########后面省略######

案例3:打印磁盘已经使用情况,去除%

#使用两条awk命令
[root@localhost ~]#df|awk '{print $5}'|awk -F% '{print $1}'
已用
8
0
0
3
0
18
1
1
100#使用一次awk命令
[root@localhost ~]#df|awk -F"[ %]+" '{print $5}'
已用
8
0
0
3
0
18
1
1
100
##也可以使用( |%)代表或者
[root@localhost ~]#df|awk -F"( |%)+" '{print $5}'
已用
8
0
0
3
0
18
1
1
100

案例4:取出文本中的ip地址及时间

####文本内容####
[root@localhost opt]#vim test.txt 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##提取
[root@localhost opt]#cat test.txt |sed '2d'|awk -F"[[ ]"  '{print $5"\t"$1}'
09/Jun/2020:03:42:43	58.87.87.99
09/Jun/2020:03:42:43	128.14.209.154
09/Jun/2020:03:43:11	64.90.40.100""sendfileo

案例5:取出文本中的主机并放回

[root@localhost opt]#vim host.txt 1 www.kgc.com
2 mail.kgc.com
3 ftp.kgc.com
4 linux.kgc.com
5 blog.kgc.com

2.4根据关键字提取所在行

案例1:提取/etc/passwd 以root开头的行

[root@localhost opt]#cat passwd |awk -F":" '/^root/{print}' 
root:x:0:0:root:/root:/bin/bash

案例2:提取/etc/passwd root所在的行

案例3:提取/etc/passwd nologin结尾的行

[root@localhost opt]#cat passwd |awk -F":" '/nologin$/{print}' 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
###########后面省略########如果提取/sbin/nologin,则需要\转义/
[root@localhost opt]#cat passwd |awk -F":" '/\/sbin\/nologin$/{print}' 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
###########后面省略######

案例4:提取ip地址

[root@localhost opt]#ifconfig ens33|awk '/netmask/{print $2}'
192.168.59.102

2.5 使用BEGIN输出包含指定字符的行并统计有多行

  1. BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作;

  2. awk再处理指定的文本,之后再执行END模式中指定的动作;

  3. END{ } 语句块中,往往会放入打印结果等语句。

#先定义变量x,表示执行多少次
[root@localhost opt]#awk 'BEGIN {x=0};/\/bin\/bash$/;{x++};END{print x}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
yxp:x:1000:1000:yxp:/home/yxp:/bin/bash
42

2.6 FS∶ 列分割符提取列

[root@localhost opt]#awk -v FS=: '{print $1FS$3}' /etc/passwd
root:0
bin:1
daemon:2
adm:3
lp:4
###########后面省略######

2.7NF∶

案例1:当前处理的行的字段个数

[root@localhost opt]#cat /etc/passwd |awk -F: '{print NF}'
7
7
7
###########后面省略######

案例2:打印出每行最后一个字段

[root@localhost opt]#cat /etc/passwd |awk -F: '{print $NF}'
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
###########后面省略######

案例3:打印出每行倒数第二个字段

[root@localhost opt]#cat /etc/passwd |awk -F: '{print $(NF-1)}'
/root
/bin
/sbin
/var/adm[root@localhost opt]#df|awk '{print $(NF-1)}'
已用%
8%
0%
0%
3%
0%
18%
1%
1%
100%

2.8 NR:

案例1: 当前处理的行的行号

#NR写在后面则在后面显示行号
[root@localhost opt]#awk  -F":" '{print $1,NR}' /etc/passwd
root 1
bin 2
daemon 3
adm 4
lp 5
sync 6
shutdown 7
halt 8#可以用制表符
[root@localhost opt]#awk  -F":" '{print $1"\t"NR}' /etc/passwd
root	1
bin	2
daemon	3
adm	4
lp	5#NR写在前面则在前面显示行号
[root@localhost opt]#awk  -F":" '{print NR"\t"$1}' /etc/passwd
1	root
2	bin
3	daemon
4	adm
5	lp

案例2:NR==n代表行号等于什么

[root@localhost opt]#awk -F: 'NR==2 {print $1}' /etc/passwd
bin

 

 

案例3:NR%2==0取偶数行

[root@localhost opt]#awk -F: 'NR%2==0 {print $1}' /etc/passwd
bin
adm
sync
halt
operator
ftp
systemd-network
polkitd

 

 

案例4:NR%2==1取奇数行

[root@localhost opt]#awk -F: 'NR%2==1 {print $1}' /etc/passwd
root
daemon
lp
shutdown
mail
games
nobody

 

 

案例5:NR==1,NR==4取区间行

[root@localhost opt]#awk -F: 'NR==1,NR==4 {print $1}' /etc/passwd
root
bin
daemon
adm

 

 

案例5:取UID数值范围$n>1000

#取uid大于1000的行
[root@localhost opt]#awk -F: '$3>1000 {print}' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin#取uid大于等于1000的行
[root@localhost opt]#awk -F: '$3>=1000 {print}' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
yxp:x:1000:1000:yxp:/home/yxp:/bin/bash

 

 

三、牛刀小试

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

[root@localhost opt]#cat /etc/fstab |awk '/[^#]/{print}'
# /etc/fstab
# Created by anaconda on Sat Sep  4 02:48:23 2021
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=183ca7c7-1989-4f43-9e81-d2676192f5a4 /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0[root@localhost opt]#cat /etc/fstab |awk '/^[^#]/{print}'|awk '{print $3}'|sort |uniq -c1 swap3 xfs

 

 

2.提取主机名并放入原文件

[root@localhost opt]#vim text.txthttp://mail.kgc.com/index.html
http://www.kgc.com/test.html
http://study.kgc.com/index.html
http://blog.kgc.com/index.html
http://www.kgc.com/images/logo.jpg
http://blog.kgc.com/20080102.html
http://www.kgc.com/images/kgc.jpg[root@localhost opt]#cat text.txt |awk -F"[. /]" '{print $3}' >>text.txt 
[root@localhost opt]#cat text.txt 
http://mail.kgc.com/index.html
http://www.kgc.com/test.html
http://study.kgc.com/index.html
http://blog.kgc.com/index.html
http://www.kgc.com/images/logo.jpg
http://blog.kgc.com/20080102.html
http://www.kgc.com/images/kgc.jpg
mail
www
study
blog
www
blog
www

 

 

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

[root@localhost opt]#grep -Eo "\b[[:alpha:]]+\b" /etc/fstab |sort|uniq -c|sort1 Accessible1 anaconda1 and1 are1 blkid1 boot1 Created1 disk1 etc1 filesystems1 findfs1 for1 info1 maintained1 man1 more1 mount1 on1 or1 pages1 reference1 root1 Sat1 See1 Sep1 under1 UUID2 by2 fstab2 home3 centos3 mapper3 swap3 xfs4 defaults4 dev

 

 

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

[root@localhost opt]#echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw"|grep -E -o "[0-9]+"
05
9
7
3

 


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

相关文章

AWK常用技巧

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

AWK用法全解

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

awk文本工具

awk 一、什么是awk?二、awk的工作原理三、命令格式四、管道符号调用四、getline 一、什么是awk? awk命令是一种编程语言,用于在linux/unix下对文本和数据进行处理。 而且它支持用户自定义函数和动态正则表达式等先进功能,是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? J2EE架构是使用Java技术开发企业级应用的一种事实上的工业标准,它是Java技术不断适应和促进企业级应用过程中的产物。Java平台有三个版本:适用于小型设备和智能卡的J2ME(Java 2 Platform Micro Edition)、适用于桌面系统的J2S…

idea创建j2ee_IntelliJ IDEA 创建J2EE项目

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

J2EE总结

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

关于J2ee

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

J2EE架构简介

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

概览J2EE

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

J2EE 全面简介

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

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

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

如何用笔记本创建局域网

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

搭建小型局域网

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

局域网组建

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

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

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

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

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

建立局域网的条件

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

如何创建一个局域网

如果你在家庭里建设小型的局域网,只需网线、路由器或者集线器或交换机即可。将网线连好后,做相应的设置就可以组建成局域网了。推荐用路由器,较方便。 对于Windows xp,典型的路由器共享上网 以下方法是我试过,可以将已…