新浪微博 登陆  注册   设为首页 加入收藏

学PHP >> 最新技术专栏 >> awk学习整理和使用实例

awk学习整理和使用实例

查看次数7931 发表时间2012-07-11 18:28:33

 AWK是一种优良的文本处理工具。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识。AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。

 

以下为awk基础学习的整理。

 

一、awk调用方式
1、awk [-F field-separator] 'commands' input-file(s)
 commands 是真正的awk命令
 -F 为域分隔符
2、第二种方法是将所有a w k命令插入一个文件,并使a w k程序可执行,然后用a w k命令解释
器作为脚本的首行,以便通过键入脚本名称来调用它。
3、第三种方式是将所有的a w k命令插入一个单独文件,然后调用:
awk -f awk-script-file input-files(s)
- f选项指明在文件awkscriptfile中的awk脚本, inputfile(s)是使用awk进行浏览的文件
名。

二、awk脚本
1、awk由模式和动作组成,模式部分决定动作语句何时触发及触发事件
模式可以是任何条件语句或复合语句或正则表达式。 模式包括两个特殊字段BEGIN和END
如:
awk 'BEGIN{print "Name\n-----"}{print $1}END{"end-of-report"}'

2、域和记录
awk执行时,其浏览域标记为$1、$2...$n
$0指所有域
保存awk输出
(1)、awk '{print $0}' grade.txt >wow 即内容重定向
(2)、使用tee命令 awk '{print $0}' grade.txt | tee wow 既显示有写入文件

3、元字符
\ ^ $ . [] | () * + ?
其中:
+ 使用+匹配一个或多个字符
? 匹配模式出现频率。例如使用/XY?Z/匹配XYZ或YZ

4、条件操作符
< 小于
>= 大于等于
<= 小于等于
~ 匹配正则表达式
== 等于
!~ 不匹配正则表达式
!= 不等于
 (1)、awk '{if($4~/Brown/) print $0} grade.txt
 其中if后面的条件用()括起来
 (2)、设置大小写 awk '/[Gg]reen/' grade.txt
 (3)、任意字符 awk '$1~/^...a/' grade.txt
 (4)、或关系匹配 awk '$0~/(Yellow)|(Brown)/' grade.txt
各表达式互相结合起来的表达式:
&& AND : 语句两边必须同时匹配为真。
|| OR:语句两边同时或其中一边匹配为真。
! 非求逆
5、内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行- F选项
NF 浏览记录的域个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符

三、awk操作符
= += *= / = %= ^ = 赋值操作符
?   条件表达操作符
|| && !   或、与、非(上一节已讲到)
~!~   匹配操作符,包括匹配和不匹配
< <= == != >>  关系操作符
+ - * / % ^  算术操作符
+ + --   前缀和后缀
1、设置输入域到域变量名
cat crontab.bak  | awk 'BEGIN{numall=20}{if($1~/[0-9]*/ && $i>numall && NR < 10) num+=$1} END{print num}' 

四、内置的字符串函数
gsub(r,s) 在整个$ 0中用s替代r
gsub(r,s,t) 在整个t中用s替代r
index(s,t) 返回s中字符串t的第一位置
length(s) 返回s长度
match(s,r) 测试s是否包含匹配r的字符串
split( s,a,fs) 在fs上将s分成序列a
sprint(fmt,exp) 返回经fmt格式化后的exp
sub(r,s) 用$ 0中最左边最长的子串代替s
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分
实例:
1、awk ' BEGIN{numall=10}{gsub(12,20);if($1~/[0-9]*/  && NR < 10) num+=length($0);print substr($0,1,index($0,"="));} END{print num}'
2、awk 'BEGIN {print split("123#456#678",myarray,"#")}'
   awk 'BEGIN { split("123#456#678",myarray,"#");print myarray[2]}'


五、字符串屏蔽序列
\b 退格键 \t tab键
\f 走纸换页 \ddd 八进制值
\n 新行 \c 任意其他特殊字符,例如\\为反斜线符号
\r 回车键

1、printf修饰符
- 左对齐
Width 域的步长,用0表示0步长
.prec 最大字符串长度,或小数点右边的位数
%c ASCII字符
%d 整数
%e 浮点数,科学记数法
%f 浮点数,例如(123.44)
%g awk决定使用哪种浮点数转换e或者f
%o 八进制数
%s 字符串
%x 十六进制数
如:awk '{printf "%-15s %s",$1,$3}'


(转发请注明转自:学PHP)    


  相关推荐



1楼 Maisyn说: 2016-09-09 15:14:08
Mallory - Thanks for the sweet conments!!Mamdy, you are so right&#8212;-I just sit around and stare at him sometimes in awe&#8230;how amazing the blessings of the Lord are&#8211;and in His perfect time!! I am truly humbled and honored every day to be a mom. I just never want to take it for granted.
2楼 Estella说: 2016-09-09 17:05:41
I have been so belerdewid in the past but now it all makes sense!

  发表评论
昵称:
(不超过20个字符或10个汉字)
内容: