当前位置:网站首页>awk入门教程
awk入门教程
2022-08-03 11:55:00 【健康搬砖人】
awk
awk
不仅是一个数据处理工具,而且是一门解释性的编程语言。它提供了十分强大的功能:支持流程控制、数学运算符,内置函数等。但是大多数时候 awk
只表现为一个命令,我们可以使用这个命令对文本数据进行格式化处理。
任务众多可以使用 awk
完成。以下只是其中的几个:
- 文本处理
- 产生格式化文本报告
- 执行算术运算
- 执行字符串操作等等
如果想深入学习 awk
,可以到 官网 学习,如果只是简单学会使用,读完这篇文章即可。
一、基本用法
awk
的用法基本是下面的形式:
# 格式
$ awk [选项] '[条件] {动作}' 文件名
# 示例1
$ awk '/usr/ {print $0}' demo.txt
# 示例2 awk 使用选项 -F 指定分割符号为 ":",不指定分割符默认为 空格
$ awk -F : '/usr/ {print $0}' demo.txt
对于 awk '/usr/ {print $0}' demo.txt
,它类似 shell
的 while
循环:
$ while read line;do echo "$line";done <demo.txt
awk
后面接两个单引号并加上大括号 {}
来设定想要对数据进行的处理动作。当然 awk
可以处理后续接的文件,也可以读取来自前个指令的标准输出。print
命令前面是一个正则表达式,只输出包含usr
的行。
awk
隐藏了读取每一行的 while
循环,它会自动读取每一行,其中的 {print $0}
对应于 Shell
的 while
循环体 echo "$line"
部分。
实际上,awk
默认会根据 空格 和 制表符,将每一行分成若干字段,依次用 $1
、$2
、$3
代表第一个字段、第二个字段、第三个字段等等。
$ echo 'this is a test' | awk '{print $0}'
this is a test
$ echo 'this is a test' | awk '{print $1}'
this
$ echo 'this is a test' | awk '{print $2}'
is
$ echo 'this is a test' | awk '{print $3}'
a
二、awk 运行方式
1. 命令行方式
# 格式
$ awk [选项] '[条件] {动作}' 文件名
# 示例
$ awk '{print $0}' demo.txt
2. 管道方式
# 格式
$ cat [文件名] | awk [动作]
# 示例
$ cat demo.txt | awk '{print $3}'
注意:前面的命令不一定是 cat
命令,只需要是输出就行。比如 ls
命令
3. 脚本
创建 .awk 后缀的脚本,并添加 chmod +x [文件名]
可执行权限
# 示例
$ touch test.awk
$ chmod +x test.awk
$ vim test.awk
添加以下内容
#!/usr/bin/awk -f
# 使用BEGIN指定字符来设定"FS"内置变量,不能用"-F"来指定了
BEGIN {
FS=":" }
# 这里可以写命令行方式引号内的语句,即正则+命名
{
print $1
}
执行
$ ./test.awk
-> 111:222:333
111
-> 222:333
222
...
三、 内置变量
awk
内置了很多变量,比如我们前面举例的 $ + 数字
表示某个字段,除此之外还提供一些其他的变量。
为了方便演示,我们新建一个 demo.txt
,如下所示:
$ vim demo.txt
1.1 2 3 A B C
4.1 5 6 D E F
7.1 8 9 H I J
1. NF
NF
代表当前行有多少个字段,$NF
就代表最后一个字段
$ cat demo.txt|awk '{print NF "\t" $NF}'
6 C
6 F
6 J
上面代码中,我们使用了转义
同理,$(NF-1)
就代表倒数第二个字段
$ cat demo.txt| awk '{print NF-1 "\t" $(NF-1)}'
5 B
5 E
5 I
2. NR
变量 NR
表示当前处理的是第几行,即表示当前行的行号。
$ awk -F ':' '{print NR ") " $1}' demo.txt
1) 1.1 2 3 A B C
2) 4.1 5 6 D E F
3) 7.1 8 9 H I J
3. FS
此变量表示输入的数据域之间的分隔符,其默认值是空格。 我们可以使用 -F
命令行选项改变它的默认值。
$ awk 'BEGIN {print "FS = " FS}'
FS =
其他
awk
的其他内置变量如下:
FILENAME
:当前文件名。
RS
:它表示(输入)记录分隔符以及它的默认值是换行。
FNR
:它类似于 NR
,但相对于当前文件。这是当 awk
工作在多个文件非常有用。 FNR
的值将重置使用新的
文件。
ORS
:输出记录换行符。一般我们肯定会理所当然的认为,换行符肯定就是\n
。但事实上,我们可以通过
ORS
变量指定相应的换行符。
ARGC
:命令行参数的个数。
ARGV
:命令后参数的数组。可以逐个打印,比如 ARGV[0]
,默认 ARGV[0]
为 “awk” 。
四、函数
awk
内置了许多函数,可以直接使用。
- 常用的内置函数如下:
toupper():用于将字符转为大写。
tolower():字符转为小写。
length(): 返回字符串长度。
substr(): 返回子字符串。
sin(): 正弦。
cos(): 余弦。
sqrt(): 平方根。
rand(): 随机数。返回一个随机数N,在0和1之间,使得0<= N <1。
int(): 整数。这个函数截断数字为整数值。
示例如下:
$ awk -F ':' '{print int($1)}' demo.txt
1
4
7
五、awk 的模式(条件)
为了方便演示,我们新增了一个 demo1.txt。
$ vim demo1.txt
/usr/root
mysql
/usr/daemon
/usr/bin
sys
前面我们说到 awk
的[基本用法](# 一、基本用法),如下所示:
# 格式
$ awk [选项] '[条件] {动作}' 文件名
条件(Pattern
),即为 模式,就是花括号前面的那一串字符串,如示例中的 /usr/
,Pattern
由于有方括号(表示该参数可忽略)。
条件(Pattern
)/模式 的两种类型
- 数学及逻辑运算符,包括:
<
、<=
、==
、>
、>=
、!=
、&&
、“
、!
- 正则表达式匹配,只有两个:
~
(正则匹配返回true)、!~
(正则不匹配返回true)。
其实正则表达式的 ~
和 !~
这两个符号并不是必须的,当不使用这两个符号时,表示对整行进行匹配,否则可以对指定列进行 匹配,另外正则表达式必须写在两个斜杠里**(/这是正则表达式/ )**
# 示例
$ awk -F ':' '/usr/ {print $1}' demo1.txt
/usr/root
/usr/daemon
/usr/bin
上面代码中,print
命令前面是一个正则表达式,只输出包含 usr
的行。
# 示例1
$ awk -F ':' 'NR % 2 == 0 {print $1}' demo1.txt
mysql
/usr/bin
上面代码中,print
命令前面是数学逻辑条件,只输出偶数行
# 示例2
$ awk -F ':' '$1 == "/usr/root" {print $1}' demo1.txt
/usr/root
# 示例3
$ awk -F ':' '$1 == "mysql" || $1 == "sys" {print $1}' demo1.txt
mysql
sys
上面的示例 2 和示例 3 输出第一个字段等于指定值的行。
六、Begin 和 End
前面提到过,其实awk花括号里的内容,相当于有一个隐藏的循环,不断的一行一行的处理并输出。
但是,如果花括号用BEGIN和END这两种模式定义了,则不会循环,它有特殊含义。BEGIN定义的模式,故名思义,只会 在循环开始的时候执行一次,而END自然就是循环结束后,再执行。
下面我们新建一个 demo2.txt
$ vim demo2.txt
1 张三 男 22 北京
2 李四 男 23 上海
3 王五 女 18 广州
4 小红 女 19 桂林
5 小安 女 20 杭州
6 小达 男 26 深圳
执行以下awk语句
$ awk -v OFS='|' 'BEGIN{print "序号","姓名","性别","年龄","地址","\n------------"} {print $1,$2,$3,$4,$5} END{print "-----------"}' demo2.txt
序号|姓名|性别|年龄|地址|
------------
1|张三|男|22|北京
2|李四|男|23|上海
3|王五|女|18|广州
4|小红|女|19|桂林
5|小安|女|20|杭州
6|小达|男|26|深圳
-----------
可以看到,BEGIN 部分输出在开头,而 END 部分输出在结尾
以上的代码相当于下面的代码:
# BEGIN
print "序号","姓名","性别","年龄","地址","\n------------"
# Action
while(!END){
{
print $1,$2,$3,$4,$5};
}
# END
print "-----------"
当然,BEGIN 还可以用来定义变量
$ awk 'BEGIN { FS=":" } {print $1}' demo2.txt
1 张三 男 22 北京
2 李四 男 23 上海
3 王五 女 18 广州
4 小红 女 19 桂林
5 小安 女 20 杭州
6 小达 男 26 深圳
七、if / if else语句
前面我们输出过偶数行,是这么输出的,是在模式里添加条件的
$ awk -F ':' 'NR % 2 == 0 {print $1}' demo1.txt
现在我们知道了还有 if
语句,所以还可以这么写
$ awk -F ':' '{if(NR % 2 == 0) print $1}' demo1.txt
如果是多条语句
$ awk -F ':' '{if(NR%2==0){print $1;print $2}}' demo1.txt
边栏推荐
- 5个超好用手机开源自动化工具,哪个适合你?
- Matlab学习12-图像处理之图像增强
- Traceback (most recent call last): File
- 3年软件测试经验,不懂自动化基础...不知道我这种测试人员是不是要被淘汰了?
- net start mysql 启动报错:发生系统错误5。拒绝访问。
- RICON:NER SOTA 又来!
- asdn涨薪技术之apifox+Jenkins如何玩转接口自动化测试
- 899. 有序队列 : 最小表示法模板题
- 【MySQL功法】第5话 · SQL单表查询
- Knowledge Graph Question Answering System Based on League of Legends
猜你喜欢
深度学习中数据到底要不要归一化?实测数据来说明!
码率vs.分辨率,哪一个更重要?
Explain the virtual machine in detail!JD.com produced HotSpot VM source code analysis notes (with complete source code)
fastposter v2.9.0 程序员必备海报生成器
零信任的基本概念【新航海】
shell编程-测试
面试官:SOA 和微服务的区别?这回终于搞清楚了!
本周四晚19:00知识赋能第4期直播丨OpenHarmony智能家居项目之设备控制实现
RICON:NER SOTA 又来!
最牛逼的集群监控系统,它始终位列第一!
随机推荐
mysql进阶(二十四)防御SQL注入的方法总结
【JS 逆向百例】某网站加速乐 Cookie 混淆逆向详解
Lease recovery system based on PHP7.2+MySQL5.7
fast planner中拓扑路径搜索
[论文阅读] (23)恶意代码作者溯源(去匿名化)经典论文阅读:二进制和源代码对比
SmobilerService 推送实现
小身材有大作用——光模块寿命分析(二)
Matlab学习10-图像处理之傅里叶变换
asdn涨薪技术之apifox+Jenkins如何玩转接口自动化测试
FE主导打造一个运营活动平台
代码分析Objective-C中的深拷贝与浅拷贝
PC client automation testing practice based on Sikuli GUI image recognition framework
一个扛住 100 亿次请求的红包系统,写得太好了!!
永寿 永寿农特产品-苹果
LeetCode刷题笔记:622.设计循环队列
基于PHP7.2+MySQL5.7的回收租凭系统
笔试题:金额拆分
记住用户名案例(js)
数据库一席谈:打造开源的数据生态,支撑产业数字化浪潮
[深入浅出]三位数排序