正则表达式中awk的学习和使用

AWK是一种优良的文本处理工具。它不仅是linux中也是任何环境中现有的功能最强大的数据处理引擎之一。这种编程及数据库访问语言(其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识
一、AWK的用法
1、在命令行模式的直接使用。 格式为: awk ‘pattern {action}’
2、将awk命令写入脚本,并以#!/bin/awk -f命令解释器作为脚本的首行,设置脚本的可执行权限,通过键入脚本名称调用它。格式为./testscript.awk filename。等同于shell脚本的方法
3、将awk命令插入一个单独文件后执行。格式为 awk -f awkscript filename
第一种格式常见的是awk 'BEGIN {print "this is the start"}{print $1,$2,$3}END{print "this is the end"}' filename。其中BEGIN和END中间是模式,END后是动作。BEGIN和END可以省去,模式一般是匹配搜索使用
二、AWK排查错误常见的问题
1、确保整个AWK用单引号括起来;2、确保单引号内所有的括号或引号成对出现;3、确保用大括号括起动作语句,用小括号括起条件语句;4有时候要检查是否有文件名或者BEGIN等
三、AWK内置字符串变量函数

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,放在数组a里。返回段数的数值
sprint(fmt,exp)
返回经fmt格式化后的exp
sub(r,s)
用$0中最左边最长的子串代替s
substr(s,p)
返回字符串s中从p开始的后缀部分
substr(s,p,n)
返回字符串s中从p开始长度为n的后缀部分

四、AWK的内置环境变量
$n 当前记录的第n个字段,字段间由FS分隔。
$0 完整的输入记录。在文本中一般指行信息内容
ARGC 命令行参数的数目。
ARGIND 命令行中当前文件的位置(从0开始算)。
ARGV 包含命令行参数的数组。
CONVFMT 数字转换格式(默认值为%.6g)
ENVIRON 环境变量关联数组。
ERRNO 最后一个系统错误的描述。
FIELDWIDTHS 字段宽度列表(用空格键分隔)。
FILENAME 当前文件
FNR 同NR,但相对于当前文件
FS 字段分隔符(默认是任何空格)。可以用户指定
IGNORECASE 如果为真,则进行忽略大小写的匹配。
NF 当前记录中的字段数。$NF指最后一个段内容
NR 当前记录数。在文本中一般指多少行
OFMT 数字的输出格式(默认值是%.6g)。
OFS 输出字段分隔符(默认值是一个空格)。
ORS 输出记录分隔符(默认值是一个换行符)。
RLENGTH 由match函数所匹配的字符串的长度。
RS 记录分隔符(默认是一个换行符)。
RSTART 由match函数所匹配的字符串的第一个位置。
SUBSEP 数组下标分隔符(默认值是\034)。
五、AWK内置操作符
= += -= *= /= %= ^= **= 赋值 如a+=10代表a+10
?: C条件表达式,a>b?a:b表示a大于b如为真返回a,如为假返回b
|| 逻辑或。只要一个为真即为真。
&& 逻辑与。只要一个为假即为假。需两个同时为真才为真。
~ ~! 匹配正则表达式和不匹配正则表达式。经常针对文本搜索
< <= > >= != == 关系运算符
空格 连接
+ - 加,减
* / & 乘,除与求余
+ - ! 一元加,减和逻辑非
^ *** 求幂
++ -- 增加或减少,作为前缀或后缀。这个一定要区分清楚++a与a++
$ 字段引用
in 数组成员

六、 AWK元字符:\(转义字符)、^ $ [] |* + ?。其中+和?只能在AWK中使用不能再sed和grep中使用。+表示匹配一个或多个字符;?表示匹配0或1个字符。
七、例子
俗话说,看的多不如动手多。让我们来通过例子加深理解和记忆吧。练起来
1、awk '{if($1="I")print $0}' greptest ###表示如果第一个字段为I就打印改行信息
2、awk '{if ($0~/good/)print $0}' greptest ###如果哪行信息可以匹配good就打印哪行信息
3、awk '{if ($0~/^[^A-Za-z]/)print $0}' greptest ###如果哪行行首是非字母就匹配哪行然后打印该行信息 $0在这里代表的是行信息内容。^平方号在[]大括号外表示行首,在内表示非
4、awk '{if($0~/good|gold/)print $0}' greptest ###如果哪行匹配good或gold就打印改行内容

5、 awk '{if($0~/go+/)print $0}' greptest ###匹配g后一个或一个以上o字母。如good gold
6、 awk '{if($0~/go?/)print $0}'greptest ###匹配g后零个或一个字母o。如go、girl而不是good
7、awk'{if($5==1024)print $0}' llvar ###匹配第五段(域)等于1024的行并打印该行
8、awk'{if($2<9 && $9~/o/)print $0}'llvar ###匹配第二段(域)小于9,并且第九段匹配字母o

9、awk '{print NF,NR,$NF,$0}' greptest ###打印几个段,行号,最后一个段内容,该行信息。 其中NF表示默认以空格为分割符分割为几个段;NR表示该行行号;FS表示分隔符赋值
10、awk '{print NF,$0,FILENAME}' greptest ###同上,FILENAME是文件
11、awk 'BEGIN{FS=":"}{print NF,$0}END{print FILENAME}' /etc/passwd分隔符=冒号

12、awk 'BEGIN{a=3;a+=2;print a}' ###答案是5。+=2的意思是加2等于,其他/=、%=同样
13、 awk 'BEGIN{a=3;b=4;a>b?b=a:a=b print a,b}' 答案是4,4。表示a大于b吗,如是把a值赋给b
14、 awk 'BEGIN{a=3;print --a;print a;print a--;print a}' 答案分别是2,2,1。注意a--的值。
15、 awk 'BEGIN{a=3;print ++a;print a;print a++;print a}' 答案是4,4,5。同上一样的道理。

16、awk 'sub("good","GOOD"){print $0}' greptest ###每行匹配第一个good,然后替换为GOOD
17、awk'sub("ou","OU",$2){print $0}'greptest ###匹配每行的第二段为ou,然后替换成OU。
18、awk'{print index($0,"good"),$0}' greptest ###查找good在行中是第几位。返回数值。
19、awk'{print match($0,"good"),$0}greptest' #该行是否包含good,如果包含返回在行中的位置
20、 awk'BEGIN{print split("0421-8888-666",aa,"-");print aa[1],aa[2],aa[3]}'答案是30421 8888 666。split函是把字符串"0421-8888-666"用分隔符"-"分出来放在aa数组里。返回值是多少段。
21、awk 'BEGIN gsub("2","9"$5);{print $0}' greptest ###替换每行中第五段凡是2的换为9, g表全部
22、awk 'BEGIN {print substr($0,1,5)' greptest ###取出每行的第一到第五位字符。
23、awk 'BEGIN {print sprintf("%10.4f",3.1415926)}' ###答案是连续四个空格3.1416。表示是个字符,小数位数为4位。默认使用右对齐格式,如用左对齐加"-"中划线。如下例。
24、 awk'BEGIN {print sprintf("%-8d%-8i",123,4567)}'答案是123五个空格4567四个空格
如果上面的这些例子没有BEGIN选项的要加入文件名,有文件名的可以省去BEGIN。可以试试上面的不加BEGIN是什么效果,一旦执行 awk' {print sprintf("%-8d%-8i",4567)}'(没有BEGIN)提示符一直会等待输入,敲回车会显示结果但还是停在那儿等待输入
25、
以下是一个awk的脚本,该脚本的目的主要是把/etc/passwd文件分段对齐。脚本先指定了一个分隔符,利用分隔符把/etc/passwd分成不同的段,然后使用格式输出工具排序对齐。
 
 
  1. #!/bin/awk-f
  2. #program:thisscriptisusedawktoseetest*informationfromthepasswd
  3. #history:2013
  4. #begintoprint
  5. BEGIN{
  6. FS=":"
  7. print"======================================================="
  8. print"Username\tFullname\tUID\tGID\tUserhome \t shell"
  9. print"======================================================="
  10. }
  11. #printformt
  12. {
  13. printf("%-10s\t%-10s\t%5i\t%5i\t%-15s\t%-10s\n",$1,$5,$3,$4,$6,$7)
  14. }
  15. #end
  16. END{
  17. print"++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
  18. print"thisis"NR"userinformation"
  19. }

以上脚本信息保存为passwd.awk文件,并赋予执行权限。使用命令./passwd.awk /etc/passwd执行。显示结果是按UsernameFullnameUIDGIDUserhome shell等顺序排序格式对齐的。

相关文章

一、校验数字的表达式 1 数字:^[0-9]*$ 2 n位的数字:^d{n}$ 3 至少n位的数字:^d{n,}$ 4 m-n位的数字...
正则表达式非常有用,查找、匹配、处理字符串、替换和转换字符串,输入输出等。下面整理一些常用的正则...
0. 注: 不同语言中的正则表达式实现都会有一些不同。下文中的代码示例除特别说明的外,都是使用JS中的...
 正则表达式是从信息中搜索特定的模式的一把瑞士军刀。它们是一个巨大的工具库,其中的一些功能经常...
一、校验数字的表达式 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数...
\ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,“n”匹配字符“n”。“\n...