千家信息网

shell脚本之正则表达式(三)---awk工具

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,awk工具在 Linux系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作
千家信息网最后更新 2025年12月03日shell脚本之正则表达式(三)---awk工具

awk工具

在 Linux系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。



awk 常见用法

一般来说 awk 所使用的命令格式如下所示,其中,单引号加上大括号"{}"用于设置对数据进行的处理动作。awk 可以直接处理目标文件,也可以通过"-f"读取脚本对目标文件进行处理。

awk 选项 '模式或条件 {编辑指令}' 文件 1 文件 2 "         //过滤并输出文件符条件的内容awk -f 脚本文件 文件 1 文件 2 "        //从脚本中调用编辑指令,过滤并输出内容

awk 相对倾向于将一行分成多个"字段"然后再进行处理,且默认情况下字段的分隔符为空格或者 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。在使用 awk 命令的过程中,可以使用逻辑操作符"&&",表示"与", "||"表示"或","!"表示"非";还可以进行简单的数学运算,如+、-、*、/、%、^分别 表示加、减、乘、除、取余和乘方。


在 Linux 系统中/etc/passwd 是一个非常典型的格式化文件,各字段间使用":"作为分隔符隔开,Linux 系统中的大部分日志文件也是格式化文件,从这些文件中提取相关信息是运维的日常工作内容之一。若需要查找出/etc/passwd 的用户名、用户 ID、组 ID 等列, 执行以下 awk 命令即可。

[root@192 ~]# awk -F ':' '{print $1,$3,$5}' /etc/passwdroot 0 rootbin 1 bindaemon 2 daemonadm 3 admlp 4 lpsync 5 syncshutdown 6 shutdown


awk工作原理图


awk 从输入文件或者标准输入中读入信息,与 sed 一样,信息的读入也是逐行读取的。不同的是 awk 将文本文件中的一行视为一个记录,而将一行中的某一部分(列)作为记录中的一个字段(域)。为了操作这些不同的字段,awk 借用 shell 中类似于位置变量的方法, 用$1、$2、$3"顺序地表示行(记录)中的不同字段。另外 awk 用$0 表示整个行(记录)。不同的字段之间是通过指定的字符分隔。awk 默认的分隔符是空格。awk 允许在命令行中用"-F 分隔符"的形式来指定分隔符。



awk 内建变量(可直接用)

FS:指定每行文本的字段分隔符,默认为空格或制表位NF:当前处理的行的字段个数NR:当前处理的行的行号(序数)$0:当前处理的行的整行内容$n:当前处理行的第 n 个字段(第 n 列)FILENAME:被处理的文件名RS:数据记录分隔,默认为\n,即每行为一条记录


awk用法

1.按行输出文本

awk '{print}' try.txt            //输出所有内容,等同于 cat test.txtawk '{print $0}' try.txt           //输出所有内容,等同于 cat test.txtawk 'NR==1,NR==3{print}' try.txt           //输出第 1~3 行内容awk '(NR>=1)&&(NR<=3){print}' try.txt           //输出第 1~3 行内容awk 'NR==1||NR==3{print}' try.txt          //输出第 1 行、第 3 行内容awk '(NR%2)==1{print}' try.txt           //输出所有奇数行的内容awk '(NR%2)==0{print}' try.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/passwdawk 'BEGIN{RS=""};END{print NR}' /etc/squid/squid.conf       //统计以空行分隔的文本段落数

范例演示
[root@192 opt]#  awk '(NR%2)==1{print}' try.txt  //输出奇数行内容13579[root@192 opt]# awk '(NR%2)==0{print}' try.txt  //输出偶数行内容24680

2.按字段输出文本

awk '{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 的所有行

范例演示
[root@192 opt]# awk -F ":" '$7~"/bash"{print $1}' /etc/passwd        //输出以冒号分隔且第 7 个字段中包含/bash 的行的第 1 个字段rootcztcccccxcaxmaxetc

3.通过管道,双引号调用shell命令

1.调用wc -l 命令统计使用bash 的用户个数,等同于 grep -c "bash$" /etc/passwd

[root@testID opt]# awk -F: '/bash$/{print | "wc -l"}' /etc/passwd9

2.调用w 命令,并用来统计在线用户数

[root@testID opt]# awk 'BEGIN {while ("w" | getline) n++ ;{print n-2}}'5

3.调用hostname,并输出当前的主机名

[root@testID opt]# awk 'BEGIN {"hostname" | getline ; print $0}'testID
输出 字段 文件 内容 处理 命令 文本 分隔符 用户 脚本 不同 格式 空格 统计 一行 信息 数据 条件 系统 中包 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 武夷山胰反网络技术有限公司 杭州品廷网络技术有限公司 互联网络科技中心 缩写 智慧团建网络安全证书错误 数据库管理规范制度 强化网络安全 提升治理能力 浙江混合现实设计软件开发 华为服务器主板序列号在哪儿 大一计算机软件开发 天津尚锦互联网科技有限公司 深圳智能消防软件开发 软件开发行业的关键绩效指标 消费升级大数据库 贵阳庶足网络技术有限公司 oracle 自动备份数据库 android网络安全实现 小学国家网络安全宣传总结 服务器管理证书 深圳罗湖软件开发 mc的服务器地址在哪里看 长城宽带能用电信服务器吗 网管怎么定位挖矿中毒的服务器 数据库技术及应用教程实验 元神怎样更换服务器 数据库中执行命令 软件开发行业的平均工资 黑龙江省威海软件开发 企业服务器能查到我的上网记录吗 2017网络安全 事件 英雄战纪星际迷航是哪个服务器
0