Linux三剑客之一awk
简单介绍一下awk的用法
再谈三剑客
grep awk sed 三个并称Linux的三剑客
awk:适合编辑,处理匹配到的文本内容
grep:擅长单纯的查找或匹配文本内容
链接: Linux—grep
sed:适合格式化文本内容,对文本进行复杂处理
链接: Linux—sed
文章目录
- Linux三剑客之一awk
- 再谈三剑客
- awk
- 语法
- 用法
- 内置变量
- 自定义输出
- awk参数
- print打印格式
- 模式pattern
- BEGIN模式
- END模式
- 关系运算符模式
- 自定义内置变量
- 正则表达式
- 语法
awk
awk有强大的文本格式化的能力,好比将一些文本数据格式化成专业的excel表的样式。
awk早期在unix上实现,用的是gawk,是GUN awk的意思。
awk更是一门编程语言,支持条件判断,数组,循环等功能。
语法
awk [option] 'pattern[action]' file
options awk可选参数
pattern 模式
action 动作(awk擅长文本格式化,且输出格式化后的结果,因此最常用的动作就是print和printf)
file 处理文件
用法
这里用到的 文件为 123.txt

对awk而言,变量分为
内置变量
自定义变量
内置变量
| 变量 | 含义 |
|---|---|
| $n | 指定分隔符后,当前记录的第n个字段 |
| $0 | 完整的输入记录 |
| FS | 字段分隔符,默认是空格 |
| NF | 当前记录数,行数 |
| NR | man wak |
更多内置变量可以man手册查看--------man awk

awk '{print $2}' 123.txt//取出第二列
$0 代表一整行 =awk '{print}' 123.txt
$1 代表第一列
······
这里执行的命令没有使用参数和模式,$2表示输出文本的第二列信息
awk默认以空格为分隔符,且多个空格也识别为一个空格,作为分隔符
awk是按行处理文件,一行处理完毕,处理下一行,根据用户指定的分隔符去工作,没有指定则默认空格

awk '{print $1,$3}' 123.txt//,代表空格 显示第一行,第三行

自定义输出
awk '{print "list1: "$1,"list2: "$3}' 123.txt //按要求输出第一行,第三行
awk 必须 外层单引号,内层双引号
内置变量$1,$2都不能添加双引号,否则会识别为文本

awk 'NR==5{print $0}' 123.txt//显示文件第五行
awk 'NR==5,NR==6{print $0}' 123.txt//显示文件第五行,第六行

awk '{print NR,$0}' 123.txt//显示每一行的行号和cat -n的操作一样

awk 'NR==37,NR==40{print NR,$0}' pwd.txt//37-40行的行号和信息显示出来

awk '{print $1, NF-1}' 123.txt//打印到数第二列

awk参数
| 参数 | 含义 |
|---|---|
| -F | 指定分隔字段符 |
| -v | 定义或修改一个awk内部变量 |
| -f | 从脚本文件中读取awk命令 |
awk默认以空格为分隔符,这里可以指定分隔符
awk -F ":" '{print $1}' pwd.txt //指定 :为分隔符打印第一列

除了使用-F选项,还可以使用变量的形式,指定分隔符,使用-v搭配选项,修改FS变量
awk -v FS=“:” ‘{print 1 , 1, 1,NF}’ pwd.txt

awk -F ":" -v OFS="===" '{print $1,$NF}' pwd.txt //以:分隔,输出时添加===

print打印格式
print打印会自动换行

printf打印不会自动换行

若想要效果一样则需要格式化字符串
awk ‘{printf “%s\n”,$2}’ abc.txt

模式pattern
awk默认是按行处理文本,如果不指定任何模式(条件),awk默认一行行处理
如果指定了模式,只有符合模式才会被处理
BEGIN模式
处理文本之前做的动作
awk 'BEGIN{print "文件夹里有"}{print $2}' abc.txt

END模式
处理完所有行之后执行的操作
awk 'BEGIN{print "处理文本之前"}{print $2}END{print "处理文本之后执行该语句"}' abc.t

关系运算符模式

awk 'NR==2{print $0}' abc.txt //输出第二行
awk 'NR!=2{print $0}' abc.txt/输出第二行以外的行

自定义内置变量
awk -F":" 'BEGIN{printf "%-30s%-30s%-30s\t%-30s\t\n","用户名","用户ID","用户家目录","用户解释器"}{printf "%-30s\t%-30s\t%-30s\t%-30s\t\n",$1,$3,$6,$7}' pwd.txt

正则表达式
正则表达式主要与awk的pattern模式结合使用
语法
awk '/正则表达式/动作' file
与 grep ‘正则表达式’ pwd.txt效果一致
但是awk配合pattern模式使用更为好用
awk '/^games/{print $0}' pwd.txt//找出pwd.txt文件中的games行

awk -F ":" '/^games/{print $1,$NF}' pwd.txt //以:为分隔符找出pwd.txt文件中gams的第一列和最后一列





![[附源码]Python计算机毕业设计Django动漫电影网站](https://img-blog.csdnimg.cn/eb33e9e83f9649808902d1da61073d9a.png)




![[附源码]Python计算机毕业设计Django高校实验室仪器设备管理系统](https://img-blog.csdnimg.cn/b2959c7668b0432c83171fcc1fa8fd1e.png)









