Linux 三剑客之awk
2021/12/24 7:07:18
本文主要是介绍Linux 三剑客之awk,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录- Linux 三剑客之awk
- 简介
- 应用场景
- awk执行流程图
- awk生命周期
- awk内置(预定义)变量
- 行与列描述
- 取行
- 取列
- awk中的函数
- 条件的分类
- awk正则详细:
- 普通正则和awk正则区别
- 范围表达式
- 逻辑表达式
- 算术表达式
- 特殊模式BEGIN{}和END{}
- awk数组
- awk 的 判断、循环
- if循环
- 循环
- 总体练习
- 易错点:
Linux 三剑客之awk
简介
awk主要是用来格式化文本,也有人称awk是一种语言,类似 C,awk 是三剑客的老大,利剑出鞘,必会不同凡响。
应用场景
- 过滤,统计,计算,统计日志
awk执行流程图
-
awk读取文件之前执行BEGIN,注意BEGIN读取文件之前就可以执行,后面不跟文件,也可以执行
# 直接执行BEGIN,不跟文件 [root@localhost ~]# awk 'BEGIN{print "直接执行"}' 直接执行
-
awk读取文件时,执行BODY块
-
awk读取文件后,执行END块
-
格式:
awk [参数] 'BEGIN{读取文件前执行的内容}条件{读取文件执行的动作}END{读取完文件执行的内容}' [文件路径]
完整流程示例(无条件要求演示):
读取文件前可以加条件,条件包括正则判断等,继续往下看,看完就明白了~
awk生命周期
grep、sed和awk都是读一行处理一行,直至处理完成
# 生命周期如下: 接收一行作为输入 把刚刚读入进来得到文本进行分解 使用处理规则处理文本 输入一行,赋值给$0,直至处理完成($0代表当前行的内容) 把处理完成之后的所有的数据交给END{}来再次处理
awk内置(预定义)变量
内置变量符号 | 功能描述 |
---|---|
$0 | 代表当前行 |
$n | 代表第n列 |
NF | 记录当前行的字段数(当前行的列数),$NF表示最后一列 |
NR | 用来记录行号(相当于计数器) |
FS | 指定文本内容字段分隔符(默认是空格) |
RS | 文本分割符 默认为换行符 |
OFS | 指定打印字段分隔符(默认空格) |
ORS | 输出的记录分隔符 默认为换行符 |
行与列描述
名称 | 描述 | 说明 |
---|---|---|
行 | 记录record | 每一行结尾默认通过回车分隔 |
列 | 记录字段/域field | 列与列默认以空格分隔,可以指定分隔符 |
取行
awk取行字符 | 描述 |
---|---|
NR==1 | 取出第1行 |
NR>=1&&NR<=5 | 取出1到5行 ---范围取 |
//,// | 正则取,谁开头到谁结尾 |
符号 | > < >= <= == != |
# 输出第一行 [root@localhost ~]# awk 'NR==1' a.sh asdfgdghgf aadadadad # 输出1到5行 [root@localhost ~]# awk 'NR>=1&&NR<=5{print NR,$0}' a.sh 1 asdfgdghgf aadadadad 2 sdasdasda hjhjjg 3 asd adas sdasdas asdasdahgf 4 asdas asdasdad adasdasd 5 baaaaaaaaaaaaaaaaaaaabbbbbbbb # 正则取,h开头的行,到m开头的行 [root@localhost ~]# cat a.sh | nl 1 hammerze 2 hanswang 3 jianiubi 4 guangtou 5 meimei 6 zhengyu 7 xuegongzi [root@localhost ~]# awk '/^h/,/^m/ {print NR,$0}' a.sh 1 hammerze 2 hanswang 3 jianiubi 4 guangtou 5 meimei
取列
-F
:指定分隔符,指定每一列结束标记(默认是空格,连续的空格Tab键),-F后也支持正则(案例4)-v
:修改变量- $数字:表示取出某一列
$0
:表示整行的内容- 补充知识:
column -t
格式化输出,美化操作
awk '{print $0}' a.sh
输出的内容和cat
的效果一样
[root@localhost ~]# awk '{print $0}' a.sh hammerze hanswang jianiubi guangtou meimei zhengyu xuegongzi [root@localhost ~]# cat a.sh hammerze hanswang jianiubi guangtou meimei zhengyu xuegongzi
案例1:取出/etc/passwd文件中的第一列和最后一列
# 为例节省占用文章空间,这里输出5行 [root@localhost ~]# awk -F: '{print NR,$1,$NF}' /etc/passwd | column -t | head -n5 1 root /bin/bash 2 bin /sbin/nologin 3 daemon /sbin/nologin 4 adm /sbin/nologin 5 lp /sbin/nologin
案例2:美化操作
[root@localhost ~]# awk -F: '{print NR,"用户名:"$1,"解释器:"$NF}' /etc/passwd | column -t | head -n5 1 用户名:root 解释器:/bin/bash 2 用户名:bin 解释器:/sbin/nologin 3 用户名:daemon 解释器:/sbin/nologin 4 用户名:adm 解释器:/sbin/nologin 5 用户名:lp 解释器:/sbin/nologin
案例3:将/etc/passwd文件的最后一列和第一列互换位置
[root@localhost ~]# awk -F':' '{print $NF,$2,$3,$4,$5,$6,$1}' /etc/passwd | head -n5 /bin/bash x 0 0 root /root root /sbin/nologin x 1 1 bin /bin bin /sbin/nologin x 2 2 daemon /sbin daemon /sbin/nologin x 3 4 adm /var/adm adm /sbin/nologin x 4 7 lp /var/spool/lpd lp # 这样得到的结果,和原来文件内容不一样缺少冒号 # 用-vOFS=:,这样空格就修改称原来的冒号就加回来了,`-F: == -vOFS=:` [root@localhost ~]# awk -F: -vOFS=: '{print $NF,$2,$3,$4,$5,$6,$1}' /etc/passwd | head -n5 /bin/bash:x:0:0:root:/root:root /sbin/nologin:x:1:1:bin:/bin:bin /sbin/nologin:x:2:2:daemon:/sbin:daemon /sbin/nologin:x:3:4:adm:/var/adm:adm /sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
案例4:取行和取列实现了文本内容“指哪打哪”,取行又取列
# 精确取ip [root@localhost ~]# ip a | awk -F "[ /]+" 'NR==3{print $3}' 127.0.0.1 # 剖析命令 awk : 命令 -F"[ /]+" : 选项 NR==3: 条件 {print $3} : 模式(动作)
取行和取列主要用到的是比较,大于小于等于···
awk中的函数
- print函数:打印
- printf函数:格式化打印
函数搭配字符
搭配字符 | 功能 |
---|---|
%s | 代表字符串 |
%d | 代表数字 |
- | 左对齐 |
+ | 右对齐 |
n | 占用字符 eg:15代表占用15个字符长度 |
# 格式化输出,以|为分隔符,换行对齐输出,没有空格补齐,超出就怼出去 [root@localhost ~]# awk -F: 'BEGIN{OFS=" | "}{printf "|%+15s|%-15s|\n", $NF,$1}' /etc/passwd # OFS输出分隔符,上面的结果打印5行看看 [root@localhost ~]# awk -F: 'BEGIN{OFS=" | "}{printf "|%+15s|%-15s|\n", $NF,$1}' /etc/passwd |head -n5 | /bin/bash|root | | /sbin/nologin|bin | | /sbin/nologin|daemon | | /sbin/nologin|adm | | /sbin/nologin|lp |
条件的分类
运算符参考表
格式:
awk [参数] 'BEGIN{读取文件前执行的内容}条件{读取文件执行的动作}END{读取完文件执行的内容}' [文件路径]
awk中的条件有如下的操作
这篇关于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操作系统入门:新手必学指南