一、shell下面直接处理awk命令
awk '{print $0}' file
awk '/^(11+?)\1+$/ {print $0}' file //著名的判断是否为素数的正则
上面两个命令都是直接可以在shell下执行的命令,基本模式是 awk pattern { action } file,就是说awk会一行一行的从file中读取文本,然后判断pattern是否满足,如果满足则执行action。
二、awk脚本的基本结构
BEGIN{} //awk的前奏,一般会在这里初始化变量、读取命令参数、设定分隔符
{} //awk的主体部分,这里主要是一行一行的从文本文件中读取数据,执行命令
END{} //这是awk的收尾部分,这时awk已经从文本文件中读取完所有数据,这时可以执行一些对结果的统计啊之类的工作
awk主体部分的执行流程:
1.从文本文件中读取一行数据
2.更新awk内置变量,如$0,NR,NF等
3.依次执行主体部分的命令
4.若文本文件中还有未读取完的数据,继续循环1-4的流程
在shell中执行awk脚本的命令是: awk -f test.awk -v arg1=9 -v arg2=8 ... file
-f 指定脚本文件,每一个-v指定一个命令参数
三、awk的基本命令
I/O命令: print 这个是打印后换行 printf 这个打印后不换行 getline 从文件中读取一行数据
如awk '{print $1}' file 打印file文件的第一列
awk '{printf $2}' file 将file文件的第二列打印为一行
getline 的命令格式为:
getline varable < file 这样file的一行数据保存入变量varable中
如果是getline < file 省略varable,则数据保存到$0中
流程控制命令: if(...){} else{}, for(...){}, while(...){} 这个跟C差不多
四、awk的内置变量
ARGC 命令参数的个数
ARGV 保存命令参数的数组
FNR 已经读入的记录数
FS 分割为记录的分隔符
OFS 输出时的分隔符
NF 当前行的记录数
NR 已经读入的行数
$0 记录当前读入的行,$1 $2 $3 ... 记录分隔后的字段
五、awk脚本调用shell命令
awk 'BEGIN{"ls" | getline}' file
六、awk应用
之前百度面试的时候有道题目是打印文本文件的奇数行,当时不知道awk,还用一个全局变量去记录换行符,挺麻烦的。用awk一行代码就OK了
awk 'NR%2==1 {print $0}' file