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动作时,”格式”中的”格式替换符”必须与 “被格式化的文本” 一一对应。

 

posted @   Rain009  阅读(129)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示