linux中awk命令(最全面秒懂)
目录
一:linux中awk命令
1.awk命令简介
copyAWK 是一种处理文本文件的语言,是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符 linux中有三剑客之称: 三剑客之首就是 AWK 三剑客功能: grep : 过滤文本 sed : 修改文本 awk : 处理文本
2.awk作用
copyawk主要是用来格式化
3.awk的语法格式
copyawk [参数] [处理内容] [操作对象]
4.解析awk使用方法
copyprint : 打印 NF : 统计总字段数 $ : 取值 结合作用: $配合NF使用 : NF内存储统计文件内每行的总字段,$存储NF内的值 NF :相当于 变量值 $ :相当于 变量名 print相当于打印 $ 内的内容
5.参数
copy-F : 指定文本分隔符 (本身默认是以空格作为分隔符) 实战案例: awd -F'f' '{print $NF}' 1.txt 解析: -F'f' : 指定f为分隔符
6.awk的生命周期
copygrep,sed和awk都是读一行处理一行,直到处理完成。 1. 接收一行作为输入 2. 把刚刚读入进来得到文本进行分解 3. 使用处理规则处理文本 4. 输入一行,赋值给$0,直至处理完成 5. 把处理完成之后的所有数据交给END{}来再次处理
二:awk中的预定义变量
copy$0 : 代表当前行(相当于匹配所有) awk -F: '{print $0, "---"}' /etc/passwd $n : 代表第n列 案例1:(以:为分隔符) awk -F: '{print $1}' /etc/passwd 案例2:(默认空格为分隔符) awk '{print $1}' /etc/passwd NF : 记录当前统计总字段数 案例1:(以:为分隔符 统计文件内每行内的行数) awk -F: '{print NF}' /etc/passwd 案例2:(以:为分隔符 统计文件内每行总字段 并打印每行统计行数) awk -F: '{print $NF}' /etc/passwd NR : 用来记录行号 案例1: awk -F: '{print NR}' /etc/passwd FS : 指定文本内容分隔符(默认是空格) 案例1: awk 'BEGIN{FS=":"}{print $NF, $1}' /etc/passwd 解析: BEGIN{FS=":"} : 相当于指定以 : 为分隔符 $NF : 存储以 : 分隔符的最后一列 $1 : 存储以 : 分隔符的第一列 print : 打印 OFS : 指定打印分隔符(默认空格) 案例1:(输出的意思 分隔符会打印出来) awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd FS 的优先级要高于 -F 解析: BEGIN{OFS=" >>> "} : 指定打印分隔符 $NF : 存储以 >>> 分隔符的最后一列 $1 : 存储以 >>> 分隔符的第一列 print : 打印
三:awk运行处理规则的执行流程
copy1. BEGIN{} : 最开始执行 2. // : 正则 3. {} : 循环体 4. END{} : 最后执行 这里面最少有一个,最多有四个!
四:awk中的函数
copyprint : 打印 printf : 格式化打印 %s : 字符串 %d : 数字 - : 左对齐 + : 右对齐 15 : 至少占用15字符 awk中函数(格式化打印) 案例1: awk -F: 'BEGIN{OFS=" | "}{printf "|%+15s|%-15s|\n", $NF, $1}' /etc/passwd 解析: | : 以 | 为分隔符 |%+15s| : 以 | 为分隔符 %s 配合 printf 使用 代替当前字符串 右对齐 占用15字符 |%-15s| : 以 | 为分隔符 %s 配合 printf 使用 代替当前字符串 左对齐 占用15字符 \n : 换行符 $NF : 存储以 | 为分隔符的最后一列 $1 : 存储以 | 为分隔符的第一列
五:awk中的定位
copy1.正则表达式 案例1:(awk中匹配有root内容的行) awk -F: '/root/{print $0}' /etc/passwd 解析: /root/{print $0} : awk中先执行正则 在执行循环 匹配文件内有root的每一行。 $0 :代表所有 案例2:(awk中匹配root开头的行) awk -F '/^root/{print $0}' /etc/passwd
六:比较表达式(匹配文本之内的内容)
copy> : 小于 < : 大于 >= : 小于等于 <= : 大于等于 ~ : 正则匹配(包含) !~ : 正则匹配(不包含) 案例1: 要求打印属组ID大于属主ID的行 awk -F: '$4 > $3{print $0}' /etc/passwd 解析: $4 : 代表属组所在列 $3 : 代表属主所在列 $0 : 所有行 案例2: 打印结尾包含bash awk -F: '$NF ~ /bash/{print $0}' /etc/passwd 解析: $NF ~ /bash/ :尾部最后一列 包含 bash 的行 ~ : 包含 a案例3: 打印结尾不包含bash awk -F '$NF !~ /bash/{print $0}' /etc/passwd 解析: !~ : 不包含 (将打印其他内容)
七:条件表达式(文本之外的内容)
copy== > < >= <= 要求打印第三行 案例1: awk -F: 'NR == 3{print $0} /etc/passwd' 解析: NR : 行号 NR == 3 : 行号等于3 注意: $1 : 是列 NR == 3 : 是行
八:逻辑表达式
copy&& : 逻辑与 || : 逻辑或 ! : 逻辑非 案例1:(与(两者条件必须都成立)) awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd 案例2:(或(两者条件一个成立即可)) awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd 案例3:(非(条件取反)) awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd
九:算数表达式
copy+ :加 - :减 * :乘 / :除 % :求余 1.要求匹配打印出属组 + 属主的ID 大于 2000 的 案例1: awk -F: '$3 + $4 > 2000{print $0}' /etc/passwd 2.要求属组 * 属主的ID 大于 2000 案例2: awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd 3.要求打印偶数行 案例3: awk -F: 'NR % 2 == 0{print $0}' /etc/passwd 解析: NR :全部行号 除以 2 == 零的 零等于余数 偶数 : 2 4 6... 4.要求打印奇数行 案例4: awk -F: 'NR % 2 == 1{print $0}' /etc/passwd NR :全部行号 除以 2 == 1的 零等于奇数 奇数: 1 3 5...
十:流程控制
copy简介: 流程控制只存在循环之中 if: awk -F: '{if($3>$4){print "大于"}else{print "小于或等于"}}' /etc/passwd 解析: 判断文件 第三列大于第四列的话打印(大于) 不大于 else if 使用格式: if(){} : 但分支 if(){}else{} : 双分支 if(){}else if(){}else{} : 多分支 for每一行打印10次 for 使用格式 awk -F: '{for(i=10;i>0;i--){print $0}}' /etc/passwd 解析: i-- 相当于python中的 i-=1 : i=i-1 减到条件不成立为止 格式: fro(i="初始值":条件判断:游标){} while每一行打印10次 while 使用格式 awk -F: '{i=1; while(i<10){print $0, i++}}' /etc/passwd 解析: i++ 相当于python中的 i+=1 加到条件不成立为止 格式: while(条件判断){}
十一:实战案例(if判断打印隔五一行线)
copy1.使用if判断 每隔5行,打印一行横线 awk -F: '{if(NR%5==0){print "----------"}print $0}' /etc/passwd 解析: 1. NR : 每一行的行号 2. 行号 除以 5 ==0 3. 打印一行 以此类推 4%5=0.8
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)