Linux三剑客之一awk
2021/12/23 7:10:34
本文主要是介绍Linux三剑客之一awk,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
awk
grep、sed和awk都是读一行处理一行,直至处理完成
定义
格式化文本
格式
awk [参数][分隔符] '{[处理规则]}' [操作对象]
awk [参数][分隔符] '{BEGIN{开始初需要的处理}/定位/{循环}END{结束前需要的处理}}' [操作对象]
参数
-F :指定文本中的分隔符(默认是以空格作为分隔符)
案例:打印系统所有用户的解析器
awk -F: '{print $NF}' /etc/passwd
生命周期
1.读取一行作为待处理文本
2.把刚刚读取进来的文本进行分解
3.再使用处理规则处理待处理文本
4.处理完,赋值给$0
5.把处理完成之后的所有的数据交给END{}来再次处理
预定义变量
$0 :当前行所有数据
awk -F: '{print $0, "---"}' /etc/passwd # 每行后面加上---
,是默认以空格作为分隔符拼接的意思
$n :第n列
awk -F: '{print $1}' /etc/passwd # 第一列
NF :记录当前行的字段数(就是分隔符分了多少段数)
awk -F: '{print NF}' /etc/passwd # 每行分了多少段
awk -F: '{print $NF}' /etc/passwd # 只显示最后一列
NR :记录行号
awk -F: '{print NR}' /etc/passwd # 给每行递增编号
FS :指定文本中的分隔符(默认空格)(与-F的作用相似 , 但优先级比之优先)
定义在BEGIN{FS="指定原文本内分隔符"}中
awk 'BEGIN{FS=":"}{print $NF, $1}' /etc/passwd # 以“:”读取最后一列和第一列
OFS :指定读取处理出来的文本中使用的分隔符(默认空格)
定义在BEGIN{FS="指定新文本中分隔符"}中
awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd # 读取最后一列和第一列中间使用>>>拼接在一起
处理规则中执行顺序
awk [参数][分隔符] '{BEGIN{开始初需要的处理}/定位/{循环}END{结束前需要的处理}}' [操作对象]
BEGIN{} :开始前需要的处理
// :定位
{} :循环
END{} :结束前需要的处理
中的函数
awk -F: 'BEGIN{OFS=" | "}{printf "|%+15s|%-15s|\n", $NF,$1}' /etc/passwd
print :打印
printf :格式化打印
%s :字符串
%d :数字
- :左对齐
+ :右对齐
15 :至少占用15字符
定位
1.正则表达式
awk -F: '/root/{print $0}' /etc/passwd # 打印含root所在行的所有内容
awk -F: '/^root/{print $0}' /etc/passwd # 打印以root开头所在行的所有内容
2.比较表达式(文本内部数据比较)
> :大于
< :小于
>= :大于等于
<= :小于等于
~ :表示匹配后面的正则表达式
!~ :表示(取反)后面的正则表达式的结果
案例:
案例1:要求打印属组ID大于属主ID的行
awk -F: '$4 > $3{print $0}' /etc/passwd # 匹配打印出第4列比第3列大的行
案例2:结尾包含bash
awk -F: '$NF ~ /bash/{print $0}' /etc/passwd # 读取最后一列给到后面正则表达式筛选出含bash的行
案例3:结尾不包含bash
awk -F: '$NF !~ /bash/{print $0}' /etc/passwd # 读取最后一列给到后面正则表达式筛选出不含bash的行
3.逻辑表达式
&& :逻辑与
awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd # 必须同时满足两个条件
|| :逻辑或
awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd # 只要满足一个条件
! :逻辑非
awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd # 必须两个条件同时都不满足
4.算术表达式
+ :加
- :减
* :乘
/ :除
% :取余
案例:
案例1:要求属组 + 属主的ID 大于 2000
awk -F: '$3 + $4 > 2000{print $0}' /etc/passwd
案例2:要求属组 * 属主的ID 大于 2000
awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd
案例3:要求打印偶数行
awk -F: 'NR % 2 == 0{print $0}' /etc/passwd
案例4:要求打印奇数行
awk -F: 'NR % 2 == 1{print $0}' /etc/passwd
5.条件表达式(内部数据与指定数据比较)
== :等于(相同)
> :大于
< :小于
>= :大于等于
<= :小于等于
案例:要求打印第三行
awk -F: 'NR == 3{print $0}' /etc/passwd # 指定 行编号为3的打印
6.范围表达式
一个选定条件到另一个选定条件之间的数据
eg:
awk -F: '/^root/,/^ftp/{print $0}' /etc/passwd # 以root开头的行到以ftp开头的行中间的行
流程控制
只存在循环中
这篇关于Linux三剑客之一awk的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-18git仓库有更新,jenkins 自动触发拉代码怎么配置的?-icode9专业技术文章分享
- 2024-12-18Jenkins webhook 方式怎么配置指定的分支?-icode9专业技术文章分享
- 2024-12-13Linux C++项目实战入门教程
- 2024-12-13Linux C++编程项目实战入门教程
- 2024-12-11Linux部署Scrapy教程:新手入门指南
- 2024-12-11怎么将在本地创建的 Maven 仓库迁移到 Linux 服务器上?-icode9专业技术文章分享
- 2024-12-10Linux常用命令
- 2024-12-06谁看谁服! Linux 创始人对于进程和线程的理解是…
- 2024-12-04操作系统教程:新手入门及初级技巧详解
- 2024-12-04操作系统入门:新手必学指南