深海的小鱼儿

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、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

posted on 2011-12-08 12:09  深海的小鱼儿  阅读(479)  评论(0编辑  收藏  举报