awk工具详解
发布时间 - 2025-07-21 00:00:00 点击率:次大家好,欢迎再次光临,我是你们的老朋友全栈君。
目录
awk简介
awk的工作原理
awk命令的使用格式
awk简介
AWK是一种专门用于处理文本文件的编程语言,是一个功能强大的文本分析工具。它旨在进行文本处理工作,通常用于扫描、过滤和统计汇总数据,这些数据可以来自标准输入、管道或文件。
awk的工作原理(1):
在读取第一行时,AWK会根据条件进行匹配,并执行相应的操作,然后继续处理下一行数据。默认情况下,不会自动输出数据。如果没有指定匹配条件,AWK会默认匹配所有行。它有一个隐含的循环,条件匹配的次数就是操作执行的次数。
awk的工作原理(2):
AWK逐行读取文本文件,默认以空格或制表符作为分隔符,将每一行分成多个字段,并将这些字段存储在内建变量中,根据模式或条件执行编辑命令。sed命令常用于处理整行,而AWK更倾向于将一行分割成多个“字段”后进行处理。AWK读取信息也是逐行进行的,处理结果可以通过print功能将字段数据显示出来。在使用AWK命令时,可以使用逻辑操作符“&&”表示“与”,“||”表示“或”,“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。
awk命令的使用格式
awk选项 ‘模式
或条件{操作}’ 文件1 文件2 ...
awk -f 脚本文件 文件1 文件2 ...
格式: awk关键字 选项 命令部分 '{xxxx}' 文件名
AWK包含几个特殊的内建变量(可以直接使用),如下所示:
FS:指定每行文本的字段分隔符,默认为空格或制表符。
NF:当前处理行的字段数量。
NR:当前处理行的行号。
$0:当前处理行的整行内容。
$n:当前处理行的第n个字段(第n列)。
FILENAME:被处理的文件名。
RS:行分隔符。AWK从文件读取数据时,会根据RS的定义将数据分割成多条记录,而AWK一次仅读入一条记录进行处理。默认值是'\n'。
简说:数据记录分隔,默认为\n,即每行为一条记录。
案例
AWK常用的内置变量包括:$1、$2、NF、NR、
$1:代表第一列,$2:代表第二列,以此类推。
$0:代表整行,NF:一行的列数。
NR:行数。
案例:
awk -F: 'NR==10{print $1}' zz ##打印第10行第一列
awk -F : '{print $NF}' zz ##打印最后一列
awk 'END{print NR}' zz ##打印总行数
awk 'END{print $0}' zz ##打印最后一整行内容
生产案例:
在逐行执行之前和之后执行特定任务,可以使用BEGIN和END关键字。
BEGIN通常用于初始化操作,只在读取数据记录之前执行一次;END通常用于汇总操作,只在读取完数据记录之后执行一次。
AWK的运算:
模糊匹配,用~表示包含,!~表示不包含。
awk -F: '$1~/root/' zz ##包含root的所有行
awk -F: '$7!~/nologin/{print $1,$7}' zz ##打印除了以nologin结尾的第一列和第七列
关于数值与字符串的比较
比较符号:== != >
案例:
awk -F: '$3==0' zz ##打印第三列等于0的行
awk 'NR==5{print}' zz ##打印第五行
awk 'NR
awk -F: '$1=="root"' zz ##打印第一列有root的行
awk -F: '$3>=1000' /etc/passwd ##打印第三列大于等于1000的行
awk -F: '$3=1000' /etc/passwd ##打印第三列小于10或者大于等于1000的所有行
awk -F: '$3>10 && $3
awk 'NR>2 && NR
seq 200 | awk '$1%7==0 && $1~/7/' ##打印200内被7整除并且包含7的所有数字
其他内置变量的用法FS、OFS、NR、FNR、RS、ORS
案例:
awk 'BEGIN{FS=":"}{print $1}' zz ##打印之前定义字段分隔符为冒号
awk 'BEGIN{FS=":";OFS="--"} {print $1,$2}' zz ##OFS定义了输出时以什么分隔,$1和$2中间要用逗号分隔,因为逗号默认被映射为OFS变量,而这个变量默认是空格
awk '{print FNR,$0}' /etc/hosts /etc/passwd ##可以看出FNR的行号在追加当有多个文件时
awk 'BEGIN{RS=":"}{print $0}' zz ##打印出以冒号换行输出
awk 'BEGIN{ORS=" "}{print $0}' zz ##把多行合并成一行输出,输出的时候自定义以空格分隔每行,本来默认的是回车键
AWK的高级用法
定义引用变量
a=100
awk -v b="$a" 'BEGIN{print b}' ##将系统的变量a,在AWK里赋值为变量b,然后调用变量b
awk 'BEGIN{print "'$a'"}' ##直接调用的话需要先用双引号再用单引号
awk -v c=50 'BEGIN{print c}' ##AWK直接定义变量引用
调用函数getline,读取一行数据的时候并不是得到当前行而是当前行下一行
案例:
df -h | awk 'BEGIN{getline}/dev\/sda3/{print $0}'
[root@localhost ky17]# seq 12 | awk '{getline;print $0}' 24681012[root@localhost ky17]# seq 12 | awk '{print $0;getline}' 1357911
if语句:AWK的if语句也分为单分支、双分支和多分支
单分支为if() {}
双分支为if() {} else {}
多分支为if() {} else if() {} else {}
案例:
AWK还支持for循环、while循环、函数、数组等
案例:
awk 'BEGIN{x=0};/\/bin\/bash$/ {x++;print x,$0};END {print x}' /etc/passwd
统计以/bin/bash结尾的行数,等同于
grep -c "/bin/bash$" /etc/passwdBEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作;AWK再处理指定的文本,之后再执行END模式中指定的动作,END{}语句块中,往往会放入打印结果等语句
awk -F ":" '!($3
awk 'BEGIN {FS=":"}; {if($3>=1000){print}}' /etc/passwd ##先处理完BEGIN的内容,再打印文本里面内容
awk -F ":" '{max=($3>=$4) ? $3:$4; {print max}}' /etc/passwd (了解)#($3>$4)?$3:$4三元运算符,如果第3个字段的值大于等于第4个字段的值,则把第3个字段的值赋给max,否则第4个字段的值赋给max
awk -F ":" '$7~/bash/{print $1}' zz ##输出以冒号分隔且第7个字段中包含/bash行的第一字段
awk -F ":" '($1~/root/) && (NF==7) {print $1,$2,$NF}' /etc/passwd ##第1个字段中包含root且有7个字段的行的第1/2个字段
awk -F ":" '($7!="/bin/bash") && ($7!="/sbin/nologin/"){print}' /etc/passwd ##/etc/passwd输出第7个字段既不为/bin/bash,也不为/sbin/nologin的所有行#输出第7个字段既不为/bin/bash,也不为/sbin/nologin的所有行
awk -F ":" '($NF != "/bin/bash")&&($NF!="/sbin/nologin"){print NR,$0}' /etc/passwd ##跟上面一样效果
通过管道、双引号调用shell命令:echo $PATH | awk 'BEGIN{RS=":"};END {print NR}'
统计以冒号分隔的文本段落数,END{}语句块中,往往会放入打印结果等语句echo $PATH | awk 'BEGIN{RS=": "}; {print NR,$0}; END{print NR}'
awk -F: '/bash$/{print "wc -l"}'/etc/passwd #调用wc -l命令统计使用bash的用户个数,
等同于grep -c "bash$" etc/passwdawk -F: '/bash$/ {print }' passwd | wc -l
发布者:全栈程序员栈长,转载请注明出处:https://www./link/da502cff136c2848905d8c0e169ba278
# unix
# 工具
# bash
# html
# echo
# print
# 运算符
# 三元运算符
# if
# for
# while
# 引用调用
# 字符串
# 循环
# 栈
# https
# 行号
# 多个
# 分隔符
# 工作原理
# 行数
# 可以使用
# 不为
# 只在
# 内建
# 往往会
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
Python图片处理进阶教程_Pillow滤镜与图像增强
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
历史网站制作软件,华为如何找回被删除的网站?
详解jQuery中基本的动画方法
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
C++时间戳转换成日期时间的步骤和示例代码
Laravel怎么连接多个数据库_Laravel多数据库连接配置
香港网站服务器数量如何影响SEO优化效果?
手机网站制作与建设方案,手机网站如何建设?
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
高端建站如何打造兼具美学与转化的品牌官网?
如何在建站之星网店版论坛获取技术支持?
大连 网站制作,大连天途有线官网?
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
简单实现jsp分页
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
如何快速搭建虚拟主机网站?新手必看指南
高防服务器租用指南:配置选择与快速部署攻略
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
简单实现Android文件上传
如何用景安虚拟主机手机版绑定域名建站?
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
html如何与html链接_实现多个HTML页面互相链接【互相】
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
三星、SK海力士获美批准:可向中国出口芯片制造设备
如何快速搭建高效WAP手机网站吸引移动用户?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
JS经典正则表达式笔试题汇总
如何在阿里云虚拟主机上快速搭建个人网站?
C#如何调用原生C++ COM对象详解
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
音响网站制作视频教程,隆霸音响官方网站?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
如何选择可靠的免备案建站服务器?
jQuery validate插件功能与用法详解
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
Angular 表单中正确绑定输入值以确保提交与验证正常工作
智能起名网站制作软件有哪些,制作logo的软件?
下一篇:C#十五子游戏编写代码
下一篇:C#十五子游戏编写代码

