shell使用-awk
工作原理:
当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出。
如果没有定义匹配条件默认是匹配所有数据行,awk隐含循环,条件匹配多少次动作就会执行多少次。
逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作。
sed命令常用于一整行的处理,而awk比较倾向于将一行分为多个"字段"然后再进行处理,awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示,
在使用awk命令的过程中,可以使用逻辑操作符"&&“表示"与”、“||“表示"或”、”!“表示"非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。
举例:
内置变量
FS:指定每行文本的字段分隔符,缺省为空格或制表位(tab)
OFS:输入字段的分割符(默认是空格)
NF:当前处理的行的字段个数
NR:当前处理的行的行号(序数)
FNR:读取文件的记录行号(从1开始,若读取新的文件依旧是从1开始)
ORS:输出行的分割符,默认为换行符
RS:行分隔符,根据RS的定义把资料切割成许多条记录
$0:当前处理的行的整行内容
$n:当前处理行的第n个字段(第n列)
常用小tips
awk 将空格或多个空格作为默认的分隔符;awk也可以拼接字符串
1、介绍BEGIN模式和END模式
BEGIN 模式指定了处理文本之前需要执行的操作:
END 模式指定了处理完所有行之后所需要执行的操作:
举例:
BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作,而上述示例没有给定任何输入源,但是awk还是会先执行BEGIN模式指定的”打印”动作,打印完成后,发现并没有文本可以处理,于是就只完成了”打印 aaa bbb”的操作
END模式以此类推,在处理完成文本后再进行的操作。
2、分隔符
默认空格作为分隔符,awk内置变量FS可以用于指定输入分隔符,但是在使用变量时,需要使用-v选项,用于指定对应的变量,比如 -v FS=’#’
输出分隔符OFS,同样需要加-v
所以同时指定输入输出分隔符情况下:
不使用输出分隔符将两列合并到一起的话,$直接连接即可
3、变量--内置变量
NR,NF;内置变量NR表示每一行的行号,内置变量NF表示每一行中一共有几列
注意:在打印 $0 , $1 , $2 这些内置变量的时候,都有使用到”$”符号,但是在调用 NR , NF 这些内置变量的时候,就没有使用”$”,如果你有点不习惯,那么可能是因为你已经习惯了使用bash的语法去使用变量,在bash中,我们在引用变量时,都会使用$符进行引用,但是在awk中,只有在引用$0、$1等内置变量的值的时候才会用到”$”,引用其他变量时,不管是内置变量,还是自定义变量,都不使用”$”,而是直接使用变量名
4、模式
awk [options] ‘Pattern {Action}’ file1 file2 ···
对于options(选项)而言,我们使用过-F选项,也使用过-v选项。
对于Action(动作)而言,我们使用过print与printf,之后的文章中,我们还会对Action进行总结。
对于Pattern(模式)而言,我们在刚开始学习awk时,就介绍了两种特殊模式,BEGIN模式和END模式,但是,我们并没有详细的介绍”模式”是什么,怎么用,而此处,我们将详细的介绍一下awk中的模式。
“模式”这个词听上去文绉绉的,不是特别容易理解,那么我们换一种说法,我们把”模式”换成”条件”,可能更容易理解,那么”条件”是什么意思呢?我们知道,awk是逐行处理文本的,也就是说,awk会先处理完当前行,再处理下一行,如果我们不指定任何”条件”,awk会一行一行的处理文本中的每一行,如果我们指定了”条件”,只有满足”条件”的行才会被处理,不满足”条件”的行就不会被处理。这样说是不是比刚才好理解一点了呢?这其实就是awk中的”模式”。
awk支持的关系运算符如下
关系运算符 |
含义 |
用法示例 |
< |
小于 |
x < y |
<= |
小于等于 |
x <= y |
== |
等于 |
x == y |
!= |
不等于 |
x != y |
>= |
大于等于 |
x >= y |
> |
大于 |
x > y |
~ |
与对应的正则匹配则为真 |
x ~ /正则/ |
!~ |
与对应的正则不匹配则为真 |
x !~ /正则/ |
5、print和printf的区别
printf动作与printf命令一样,都不会输出换行符,默认会将文本输出在一行里面(printf命令则不会对输出的文本进行换行)。

-
awk ‘{print $1 $2}’ 表示每行分割后,将第一个字段和第二个字段连接在一起输出。
-
awk ‘{print $1,$2}’ 表示每行分割后,将第一个字段和第二个字段以输出分隔符隔开后输出
我们来总结一下,在awk中使用printf动作时,需要注意以下3点。
1)使用printf动作输出的文本不会换行,如果需要换行,可以在对应的”格式替换符”后加入”\n”进行转义。
2)使用printf动作时,”指定的格式” 与 “被格式化的文本” 之间,需要用”逗号”隔开。
3)使用printf动作时,”格式”中的”格式替换符”必须与 “被格式化的文本” 一一对应。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通