一、awk简介
awk是linux中强大的文本数据处理工具,可以读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表等功能;
awk 是『以“行”为一次处理的单位』,『以字段为最小的处理单位』,小说相关网页是主要针对文本的显示和处理,awk是很常用的一个工具。
二、awk的运作模式
1、awk的语法:
[root@jing ~]# awk '条件类型1 {动作1} 条件类型2 {动作2}...' filename
* awk后面的所有条件类型和动作都在单引号内,由于单引号不双引号都必须是成对的,单引号中使用非变量时,需要使用双引号括起来;
* 条件类型【实例三】和动作是一组操作,当满足条件类型时,方执行后面紧跟的动作操作;
* 条件类型即需要满足的条件,可以是表达式,也可以是正则;动作即对满足条件类型的数据所做的具体操作。
* awk的条件类型的位置:
根据语法表达式:条件类型1 {动作1},条件类型的位置在花括号外面,如 NR==1 {print $0} 代表 当当前处理行为第一行时,则输出当前行;
条件类型的位置也可以在花括号内部,在花括号内部时,可使用if等条件语句,如 {if(NR==1) print $0}。
2、行、字段【实例一】
awk 是『以“行”为一次处理的单位』,『以字段为最小的处理单位』
* awk 是『以“行”为一次处理的单位』:文件由若干行组成,文件中的每一行都会执行命令行中awk的命令
* awk是『以字段为最小的处理单位』:行被分隔符分隔为若干个字段,$0代表当前行的所有数据,$1代表当前行的第一个字段,awk命令中可通过$0 $1 $2等来显示其对应的内容;
如下为user.txt中的内容,第一行为例,$0代表 name mobile email整行的数据,$1=name,$2=mobile,$3=email
name mobile email
jing 111111 2222@qq.com
3、awk的内置变量【实例二】
变量名称 | 说明 |
NF | 每一行 ($0) 拥有的字段总数 |
NR | 当前 awk命令 所处理的是『第几行』数据 |
FS | 分隔符,默认分隔符为空格; |
FILENAME | 当前处理的档案名称 |
$0 | 当前行的数据 |
$1~$n | 当前行的第n个字段 |
OFS | 设置输出字段的分隔符,默认为空格 |
ORS | 设置输出行的分隔符,默认为换行符 |
* 默认分隔符FS为空格时,$1 $2为空格分隔的字段;当分隔符为非空格时,则需要使用FS设定分隔符后方可取到$1 $2的值
4、awk的逻辑运算符【实例二】
条件类型中可能需要使用到逻辑运算符,awk的逻辑运算符如下:
运算符 | 代表意思 |
> | 大于 |
< | 小于 |
>= | 大于或等于 |
<= | 小于或等于 |
== | 等于 |
!= | 不等于 |
~ | 匹配正则表达式 |
!~ | 不匹配正则表达式,正则表达式即通用的正则语法 |
5、BEGIN和END模块【实例五】
1)BEGIN和END模块简介
在某些编程情况中,可能需要在 awk 开始处理文件中的文本之前执行初始化代码,和构造函数的初始化一样。对于这种情况, awk可以通过定义一个 BEGIN 块实现初始化代码;
awk的BEGIN块是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置
同理,awk 处理文件中的所有行之后,可能需要在最后做一些操作,对于这种情况,awk可以通过定义一个END块实现;通常, END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。
6、实例
需要操作的文件awk_scores.txt的内容如下:
1)实例一:行和字段
*输出awk_scores.txt中的内容【行:$0代表当前行的数据】
awk '{print $0}' awk-scores.txt
*输出awk_scores.txt中每个人的姓名和03科目的分数【行的字段】
awk '{print $1 "\t" $4}' awk-scores.txt
2)实例二:awk的内置变量
*在awk_scores.txt的每一行输出当前操作行的行号
awk '{print NR ":" $0}' awk-scores.txt
3)实例三:awk的条件类型和逻辑运算符
*输出awk_scores.txt的第二行,并在其行首输出当前行的行号【条件为逻辑运算符】
awk 'NR==2 {print NR ":" $0}' awk-scores.txt【条件在花括号外】
awk '{if(NR==2)print NR ":" $0}' awk-scores.txt【条件在花括号内】
* 输出姓名为jing的所有行成绩【正则条件】
awk '$1~/^jing$/ {print $0}' awk-scores.txt
awk '$1=="jing"{print $0}' awk-scores.txt
awk '{if($1=="jing")print $0}' awk-scores.txt
4)实例四:awk和其他命令组合使用
*输出awk_scores.txt中前两行的内容
awk '{print $0}' awk-score.txt | head -n 2
*输出awk-scores.txt中最后两行的内容
5)实例五:【BEGIN和END模块】
需要操作的文件awk_scores.txt的内容如下:
* 输出每个人的姓名和03科目的分数【BEGIN和END模块】
方法一:命令行运行: awk '{FS="-"} {print $1 "\t" $4}' awk-score.txt
结果如图一,可以看到第一行并没有正确显示出来,因为我们读入第一行的时候, $1,$2... 的获取默认还是以空格键为分隔的,所以虽然我们定义了 FS="-" 了, 但是即仅能在第二行后才开始生效,这种情况就需要使用BEGIN块在awk处理文件中的文本之前,先把文件中的分隔符初始化为-,这样读入第一行的时候,便是分隔符为-的数据了。
优化方法:awk 'BEGIN {FS="-"} {print $1 "\t" $4}' awk-score.txt
执行结果如图二,达到了想要的效果
图一
图二
6) 将awk的执行结果写入文件中
7)实例七:OFS ORS
*输出awk_scores.txt中所有的行,字段之间使用#分隔显示
awk 'BEGIN{FS="-";OFS="#"}{print $1,$2,$3,$4}' awk-score.txt
通过BEGIN模块初始化分隔符,FS分隔符为-,得到$1~$n,OFS设置输出字段时,字段间的分隔符为#
print字段时,字段之间使用逗号,OFS的输出分隔符方可生效。
扩展资料
https://coolshell.cn/articles/9070.html
http://www.study-area.org/linux/system/linux_shell.htm
https://jingyan.baidu.com/album/eae078277a52651fed548557.html?picindex=1