Linux awk命令详解:3分钟掌握文本处理神器,运维必看!​

linux中awk命令详解(最全面秒懂)


一:linux中awk命令
1.awk命令简介
|     |     |
|---|---|
|     |AWK是一种处理文本文件的语言,是一个强大的文本分析工具。|
|     |之所以叫AWK是因为其取了三位创始人AlfredAho,PeterWeinberger,和BrianKernighan的FamilyName的首字符|
|     |linux中有三剑客之称:|
|     |三剑客之首就是AWK|
|     |三剑客功能:|
|     |grep:过滤文本|
|     |sed  :修改文本|
|     |awk  :处理文本 |

2.awk作用
|     |     |
| --- | --- |
|     | awk主要是用来格式化 |
3.awk的语法格式
|     |     |
| --- | --- |
|     | awk [参数] [处理内容] [操作对象] |
|     |     |
4.解析awk使用方法
|     |     |
| --- | --- |
|     | print    : 打印 |
|     | NF        : 统计总字段数 |
|     | $        : 取值 |
|     | 结合作用: |
|     | $配合NF使用 : NF内存储统计文件内每行的总字段,$存储NF内的值 |
|     | NF    :相当于 变量值    $    :相当于 变量名 |
|     | print相当于打印 $ 内的内容 |
image
image
5.参数
|     |     |
| --- | --- |
|     | -F : 指定文本分隔符 (本身默认是以空格作为分隔符) |
|     |     |
|     |     |
|     | 实战案例: |
|     |     |
|     | awd    -F'f' '{print $NF}' 1.txt |
|     |     |
|     |     |
|     | 解析: |
|     |     |
|     | -F'f'    : 指定f为分隔符 |
|     |     |
6.awk的生命周期
|     |     |
| --- | --- |
|     | grep,sed和awk都是读一行处理一行,直到处理完成。 |
|     |     |
|     |     |
|     | 接收一行作为输入 |
|     |     |
|     |     |
|     | 把刚刚读入进来得到文本进行分解 |
|     |     |
|     |     |
|     | 使用处理规则处理文本 |
|     |     |
|     |     |
|     | 输入一行,赋值给$0,直至处理完成 |
|     |     |
|     | 把处理完成之后的所有数据交给END{}来再次处理 |
|     |     |
二:awk中的预定义变量
|     |     |
| --- | --- |
|     | $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运行处理规则的执行流程
|     |     |
| --- | --- |
|     | 1. BEGIN{}    : 最开始执行 |
|     | 2. //        : 正则 |
|     | 3. {}        : 循环体 |
|     | 4. END{}    : 最后执行 |
|     | 这里面最少有一个,最多有四个! |
|     |     |
四:awk中的函数
|     |     |
| --- | --- |
|     | print    : 打印 |
|     | 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中的定位
|     |     |
| --- | --- |
|     | 1.正则表达式 |
|     | 案例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 |
六:比较表达式(匹配文本之内的内容)
|     |     |
| --- | --- |
|     | >        : 小于 |
|     | <        : 大于 |
|     | >=        : 小于等于 |
|     | <=        : 大于等于 |
|     | ~        : 正则匹配(包含) |
|     | !~        : 正则匹配(不包含) |
|     |     |
|     |     |
|     | 案例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 |
|     |     |
|     | 解析: |
|     |     |
|     | !~    : 不包含 (将打印其他内容) |
|     |     |
七:条件表达式(文本之外的内容)
|     |     |
| --- | --- |
|     | ==  |
|     | >   |
|     | <   |
|     | >=  |
|     | <=  |
|     |     |
|     |     |
|     | 要求打印第三行 |
|     |     |
|     | 案例1: |
|     |     |
|     | awk -F: 'NR == 3{print $0} /etc/passwd' |
|     |     |
|     | 解析: |
|     |     |
|     | NR  : 行号 |
|     |     |
|     | NR == 3  : 行号等于3 |
|     |     |
|     |     |
|     |     |
|     |     |
|     | 注意: |
|     |     |
|     | $1         : 是列 |
|     |     |
|     | NR == 3  : 是行 |
|     |     |
|     |     |
|     |     |
八:逻辑表达式
|     |     |
| --- | --- |
|     | &&        : 逻辑与 |
|     | \|        : 逻辑或 |
|     | !       : 逻辑非 |
|     |     |
|     |     |
|     | 案例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 |
|     |     |
九:算数表达式
|     |     |
| --- | --- |
|     | +    :加 |
|     | -    :减 |
|     | *    :乘 |
|     | /    :除 |
|     | %    :求余 |
|     |     |
|     |     |
|     | 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 == 零的 零等于余数 |
|     |     |
|     |     |
|     |     |
|     |     |
|     | 偶数 : 246... |
|     |     |
|     |     |
|     |     |
|     |     |
|     | 4.要求打印奇数行 |
|     |     |
|     | 案例4: |
|     |     |
|     | awk -F: 'NR % 2 == 1{print $0}' /etc/passwd |
|     |     |
|     |     |
|     |     |
|     | NR  :全部行号 除以 2 == 1的 零等于奇数 |
|     |     |
|     |     |
|     | NR  :全部行号 除以 2 == 1的 零等于奇数 |
|     | 奇数: 135... |
|     |     |
十:流程控制
|     |     |
|---|---|
|     | 简介: |
|     | 流程控制只存在循环之中 |
|     |     |
|     |     |
|     |if: |
|     |     |
|     | awk -F: '{if($3>$4){print "大于"}else{print "小于或等于"}}' /etc/passwd |
|     |     |
|     | 解析: |
|     |     |
|     | 判断文件 第三列大于第四列的话打印(大于) 不大于 else|
|     |     |
|     |     |
|     |     |
|     |     |
|     |if 使用格式: |
|     |     |
|     |if(){}                   : 但分支 |
|     |     |
|     |if(){}else{}            : 双分支 |
|     |     |
|     |if(){}elseif(){}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判断打印隔五一行线)
|     |     |
| --- | --- |
|     | 1.使用if判断 |
|     | 每隔5行,打印一行横线 |
|     | awk -F: '{if(NR%5==0){print "----------"}print $0}' /etc/passwd |
|     | 解析: |
|     | 1. NR    : 每一行的行号 |
|     | 2. 行号 除以 5 ==0 |
|     | 3. 打印一行 |
|     | 以此类推 4%5=0.8 |
|     |     |

链接: https://www.cnblogs.com/zhengyan6/p/16290156.html

(版权归原作者所有,侵删)

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值