Shell编程之正则表达式(三)
发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,awk工具在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复
千家信息网最后更新 2025年02月06日Shell编程之正则表达式(三)
awk工具
在 Linux/UNIX
系统中,awk
是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell
脚本,完成各种自动化配置任务。
1. awk常见用法
awk
所使用的命令格式如下所示,单引号加上大括号"{}"
用于设置对数据进行的处理动作。awk
可以直接处理目标文件,也可以通过"-f"
读取脚本对目标文件进行处理。awk 选项 '模式或条件 {编辑指令}' 文件1 文件2 //过滤并输出文件符条件的内容awk -f 脚本文件 文件1 文件2 //从脚本中调用编辑指令,过滤并输出内容
sed
命令常用于一整行的处理,而awk
比较倾向于将一行分成多个"字段"然后再进行处理,且默认情况下字段的分隔符为空格或者tab
键。awk
执行结果可以通过print
的功能将字段数据打印显示。在使用awk
命令的过程中,可以使用逻辑操作符"&&"
,表示"与","||"
表示"或","!"
表示"非";还可以进行简单的数学运算,如+
、-
、*
、/
、%
、^
分别 表示加、减、乘、除、取余和乘方。在 Linux 系统中
/etc/passwd
是一个非常典型的格式化文件,各字段间使用":"
作为分隔符隔开,Linux
系统中的大部分日志文件也是格式化文件,从这些文件中提取相关信息是运维的日常工作内容之一。若需要查找出/etc/passwd
的用户名、用户ID
、组ID
等列, 执行以下 awk 命令即可。[root@localhost ~]# awk -F ':' '{print $1,$3,$4}' /etc/passwdroot 0 0bin 1 1daemon 2 2adm 3 4...//省略部分内容...//awk从输入文件或者标准输入中读入信息,与 sed 一样,信息的读入也是逐行读取的。不同的是awk将文本文件中的一行视为一个记录,而将一行中的某一部分(列)作为记录中的一个字段(域)。为了操作这些不同的字段,awk借用shell中类似于位置变量的方法, 用$1、$2、$3"顺序地表示行(记录)中的不同字段。另外awk用$0表示整个行(记录)。不同的字段之间是通过指定的字符分隔。awk默认的分隔符是空格。awk允许在命令行中用"-F分隔符"的形式来指定分隔符。
awk
包含几个特殊的内建变量(可直接用)如下所示
内建变量 | 说明 |
---|---|
FS | 指定每行文本的字段分隔符,默认为空格或制表位 |
NF | 当前处理的行的字段个数 |
NR | 当前处理的行的行号(序数) |
$0 | 当前处理的行的整行内容。 |
$n | 当前处理行的第 n 个字段(第 n 列) |
FILENAME | 被处理的文件名 |
RS | 数据记录分隔,默认为\n ,即每行为一条记录 |
2.用法示例
1)按行输出文本
[root@localhost opt]# awk '{print}' bbb.txt //输出所有内容,等同于 cat bbb.txtthis isthe woodwoodwodthe woodthis is test
[root@localhost opt]# awk '{print $0}' bbb.txt //输出所有内容,等同于 cat bbb.txtthis isthe woodwoodwodthe woodthis is tes
[root@localhost opt]# awk 'NR==1,NR==3{print}' bbb.txt //输出第 1~3 行内容this isthe woodwood
[root@localhost opt]# awk '(NR>=1)&&(NR<=3){print}' bbb.txt //输出第 1~3 行内容this isthe woodwood
[root@localhost opt]# awk 'NR==1||NR==3{print}' bbb.txt //输出第 1 行、第 3 行内容this iswood
[root@localhost opt]# awk '(NR%2)==1{print}' bbb.txt //输出所有奇数行的内容this iswoodthe wood
[root@localhost opt]# awk '(NR%2)==0{print}' bbb.txt //输出所有偶数行的内容the woodwodthis is test
[root@localhost opt]# awk '/^the/{print}' bbb.txt //输出所有以the开头的行the woodthe wood
[root@localhost opt]# awk '/wood$/{print}' bbb.txt //输出所有以wood结尾的行the woodwoodthe wood
[root@localhost opt]# awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd2 //统计以/bin/bash 结尾的行数,等同于 grep -c "/bin/bash$" /etc/passwd
[root@localhost opt]# awk 'BEGIN {RS=""};END{print NR}' httpd.txt //统计以空行分隔的文本段落数38
2)按字段输出文本
[root@localhost opt]# vim bbb.txt //编辑文本内容this is txtthe wood aaawood is bbb //编辑添加内容wod is cccthe wood AAAthis is test~ ~ :wq //保存退出[root@localhost opt]# awk '{print $3}' bbb.txt //输出每行中(以空格或制表位分隔)的第 3 个字段txtaaabbbcccAAAtest
[root@localhost opt]# awk '{print $1,$3}' bbb.txt //输出每行中的第 1、3 个字段this txtthe aaawood bbbwod cccthe AAAthis test
[root@localhost opt]# awk -F ":" '$2=="*"{print}' /etc/shadow //输出密码为"*"的用户的shadow记录bin:*:17110:0:99999:7:::daemon:*:17110:0:99999:7:::adm:*:17110:0:99999:7:::lp:*:17110:0:99999:7:::sync:*:17110:0:99999:7:::shutdown:*:17110:0:99999:7:::halt:*:17110:0:99999:7:::mail:*:17110:0:99999:7:::operator:*:17110:0:99999:7:::games:*:17110:0:99999:7:::ftp:*:17110:0:99999:7:::nobody:*:17110:0:99999:7:::
[root@localhost opt]# awk 'BEGIN{FS=":"};$2=="*";END{print}' /etc/shadow bin:*:17110:0:99999:7::: //输出密码为"*"的用户的shadow记录daemon:*:17110:0:99999:7:::adm:*:17110:0:99999:7:::lp:*:17110:0:99999:7:::sync:*:17110:0:99999:7:::shutdown:*:17110:0:99999:7:::halt:*:17110:0:99999:7:::mail:*:17110:0:99999:7:::operator:*:17110:0:99999:7:::games:*:17110:0:99999:7:::ftp:*:17110:0:99999:7:::nobody:*:17110:0:99999:7:::named:!!:18178::::::
[root@localhost opt]# awk -F ":" '$7~"/bash"{print $1}' /etc/passwdroot //输出以冒号分隔且第 7 个字段中包含/bash 的行的第 1 个字段 sun
[root@localhost opt]# awk '($1~"nfs")&&(NF==8){print $1,$2}' /etc/services nfs 2049/tcp //输出包含 8 个字段且第 1 个字段中包含 nfs 的行的第 1、2 个字段nfs 2049/udpnfs 2049/sctpnetconfsoaphttp 832/tcpnetconfsoaphttp 832/udpnetconfsoapbeep 833/tcpnetconfsoapbeep 833/udp
[root@localhost opt]# awk -F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwdsync:x:5:0:sync:/sbin:/bin/sync //输出第 7 个字段既不为/bin/bash 也不为/sbin/nologin 的所有行 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/halt
3)通过管道、双引号调用 Shell 命令
[root@localhost opt]# awk -F : '/bash/{print | "wc -l"}' /etc/passwd2 //调用wc -l 命令统计使用bash 的用户个数,等同于 grep -c "bash$" /etc/passwd
[root@localhost opt]# awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}'1 //调用w 命令,并用来统计在线用户数,使用while循环匹配w 命令输出行数,getline为只显示行数,n-2为减去前两行
[root@localhost opt]# awk 'BEGIN { "hostname" | getline ; print $0}' localhost.localdomain //调用hostname,并输出当前的主机名
输出
字段
内容
文件
处理
命令
文本
分隔符
用户
不同
格式
空格
脚本
统计
一行
信息
变量
数据
条件
系统
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全建设内容有哪些
中国网络安全国际学院
软件开发中模块中接口的概念
农安品质网络技术咨询诚信服务
网络安全学习交流
sql在数据库中指的是
数据库小例子
米内网数据库中国药科大学
h2数据库优点缺点
怎么在并行数据库实现并操作
湖北多功能软件开发代理价钱
如何成立一家软件开发外包
菏泽成武法院网络安全建设
企业网络安全管理和防护措施
博汇科技算不算中概互联网公司
软件开发工程师培训中心
各种数据库结构区别
e31231支持服务器内存么
数据库自增字段
服务器配置与管理发展方向
大话2提示服务器校检失败
河北现代化软件开发品牌
盐城厂家软件开发平台
河南专升本网络安全宣传周
怎么在并行数据库实现并操作
mdm 数据库
聊城软件开发培训班
联想服务器机箱
软件开发用图标
证券网络安全知识竞赛试题