Linux——精通AWK——未完成

1、AWK用法入门

awk 'awk_program' a.txt

# a.txt 是要读取的文件,可以指定多个文件
# 单引号:在awk中经常使用$符号,而$符号在shell是变量符号,使用双引号会被解析为shell变量。
# ‘{}’大括号表示代码块,代码块之间可以连用,代码块内部的多个语句使用分好';'分隔。
awk '{print $0}' a.txt

# 1、读取文件第一行
# 2、将所读取的行赋值给awk的变量$0,于是$0中保存的就是本次所读取的行数据
# 3、进入代码块{print $0}并执行print $0,即输出$0
# 4、执行完本次代码之后,进入下一轮awk循环:

2、语句块

1、BEGIN语句块
awk 'BEGIN{print 'first'}{print $0}' a.txt

# 在读取文件之前执行,且执行一次
# 在begin代码块中,无法使用$0或其它一些特殊变量
2、END语句块
awk 'END{print 'last'}{print $0}' a.txt

# 在读取文件完成之后执行,且执行一次
# 有END代码块,必有要读取的数据
# END代码块中可以使用$0等一些特殊变量,只不过这些特殊变量保存的是最后一轮awk循环的数据
3、main语句块
awk 'BEGIN{print 'first'}{print $0}END{print 'last'}' a.txt

# 读取文件是循环执行,默认每读取一行,就执行一次main代码块
# main代码块可有多个

3、RS使用

1、简单说明
# RS="\n" 、 RS="m"
awk 'BEGIN{RS="\n"}{print $0}' a.txt
awk 'BEGIN{RS="m"}{print $0}' a.txt

# RS通常设置在GEGIN代码块中,因为要先于读取文件就确定好RS分割符。
# RS指定输入记录分隔符时,所读取的记录中是不包含分隔符字符的。例如RS="a",
# 则$0中一定不可能出现字符a。
2、特殊需求:

特殊的RS值用来解决特殊读取需求:

RS="":按段落读取
RS="\0":一次性读取所有数据,但有些特殊文件中包含了空字符\0
RS="^$":真正的一次性读取所有数据,因为非空文件不可能匹配成功
RS="\n+":按行读取,但忽略所有空行

3、预定义变量

在awk每次读完一条记录时,会设置一个称为RT的预定义变量。
当RS为单个字符时,RT的值和RS的值是相同的。

当RS为多个字符(正则表达式)时,则RT设置为正则匹配到记录分隔符之后,真正用于划分记录时的字符。

当无法匹配到记录分隔符时,RT设置为控制空字符串(即默认的初始值)。

awk ‘BEGIN{RS=”(fe)?male”}{print RT}’ a.txt

4、两种行号:NR和FNR

在读取每条记录之后,将其赋值给$0,同时还会设置NR、FNR、RT。

NR:所有文件的行号计数器
FNR:是各个文件的行号计数器

5、引用字段的方式

awk '{n = 5;print $n}' a.txt # 输出文件的第五列
awk '{print $(2+2)}' a.txt   # 括号必不可少,用于改变优先级,输出文件的第四列
awk '{print $(NF-3)}' a.txt

6、分割字段的方式

方式一:FS或-F
# 字段分隔符指定为单个字符
awk -F":" '{print $1}' /etc/passwd
awk 'BEGIN{FS=":"}{print $1}' /etc/passwd

# 字段分隔符指定为正则表达式
awk 'BEGIN{FS=" +|@"}{print $1,$2,$3,$4,$5,$6}' a.txt
方式二:FIELDWIDTHS
# 没取完的字符串DDD被丢弃,且NF=3
$ awk 'BEGIN{FIELDWIDTHS="2 3 2"}{print $1,$2,$3,$4}' <<<"AABBBCCDDDD"
AA BBB CC 

# 字符串不够长度时无视
$ awk 'BEGIN{FIELDWIDTHS="2 3 2 100"}{print $1,$2,$3,$4"-"}' <<<"AABBBCCDDDD"
AA BBB CC DDDD-

# *号取剩余所有,NF=3
$ awk 'BEGIN{FIELDWIDTHS="2 3 *"}{print $1,$2,$3}' <<<"AABBBCCDDDD"      
AA BBB CCDDDD

# 字段数多了,则取完字符串即可,NF=2
$ awk 'BEGIN{FIELDWIDTHS="2 30 *"}{print $1,$2,NF}' <<<"AABBBCCDDDD"  
AA BBBCCDDDD 2
方式三:FPAT

7、修改字段或NF值的联动效应

8、getline用法详解

发布了128 篇原创文章 · 获赞 0 · 访问量 2501

猜你喜欢

转载自blog.csdn.net/qq_41134008/article/details/105526270