awk学习手记-1
awk学习网址推荐:http://www.zsythink.net/archives/tag/awk/
AWK的学习有助于提升工作效率,现在抽时间总结一下,AWK的基础使用方法。
实际上,awk是一门编程语言,他支持条件判断,数组,循环操作等功能,我们一般把awk当作脚本语言解释器。
grep 、 sed 、 awk 被人们称为Linux三剑客。简单总结下各位特长:
grep:擅长单纯的文本查找和匹配
sed:擅长编辑匹配到的文本。
awk:擅长按照需求格式化文本。
sed 和 awk 也都有文本查找和匹配功能,不然不可能进行编辑和格式化。
一、AWK官方
awk是一个报告生成器,它拥有强大的文本格式化能力。
解释:报告可以理解成表格,awk善于将文本整理成表格的样式然后再展示出来。
二、awk基础
awk基础语法:awk [options] 'program' file1,file2...
将上述语法中的program进行细化,可以得到awk扩展语法:
awk [options] 'Pattern {Action}'file
awk语法中action指的就是动作,awk格式化文本并将其输出。
从最简单的案例开始认识awk,直接指定action。
例一、
[root@my127 awk]# cat 3.txt
Hello World!
[root@my127 awk]# awk '{print}' 3.txt
Hello World!
可以看到awk执行了打印动作,同cat命令。
例二、
[root@my127 awk]# cat 4.txt
root test prom tmp
123 456 78900 00
WWW GOO GLE COM
[root@my127 awk]# cat 4.txt | awk '{print $4}'
tmp
00
COM
[root@my127 awk]# awk '{print $4}' 4.txt
tmp
00
COM
观察上面的用例,发现:
1、awk可以自己操作文本,也可以通过管道进行操作;
2、print $4 打印了4.txt中的第四列,实际上观察文件中4,5两列空格数并不一致,但是因为不指认分隔符,awk就默认多个空格等同于成一个空格,仅作为一个分隔符。
awk是逐行处理文本数据的,遇到‘回车换行’就会认为当前行结束,新开一行;
此外,awk在用户没有设置分隔符时,默认使用空格作为字段分隔符。
简单说就是: 回车分隔行,空格分割字符。
$0:表示整行
$n:表示第n列
$NF:表示最后一列
awk ‘{print }’ file 与awk ‘{print $0}’ file是一样的
注:NF代表列总数,$ NF代表最后一列内容
例如一行文本被分割成7段,NF值为7;
$ NF值为文本的第七列,与此同理,倒数第二列可以表示为$(NF-1)。
例三、
我们可以使用$n一次输出多个指定的列,如下图所示:
[root@my127 awk]# cat 4.txt
root test prom tmp
123 456 78900 00
WWW GOO GLE COM
[root@my127 awk]# awk '{print $1,$3}' 4.txt
root prom
123 78900
WWW GLE
如果希望指定的列连接在一起,即没有空格分割,则不适用逗号分开$n
[root@my127 awk]# awk '{print $1$3}' 4.txt
rootprom
12378900
WWWGLE
例五、
除了输出文本内容以外,我们还可以添加自定义字段,将自定义字段和文本中原有列进行结合后输出。
[root@my127 awk]# awk '{print "demo",$1,$2,"string"}' 4.txt
demo root test string
demo 123 456 string
demo WWW GOO string
只有字符串使用" “包裹,
变量一定不要加” ",否则会被识别成文本输出。
[root@my127 awk]# awk '{print "demo",$1,"$2","string"}' 4.txt
demo root $2 string
demo 123 $2 string
demo WWW $2 string
三、模式
刚才我们通过几个小例子认识了awk中最常用的Action:print
现在我们来认识一下模式,也就是Pattern,Pattern中最容易理解的就是BEGIN和END
BEGIN:指定了文本处理之前需要执行的操作;
END:指定了文本处理完之后需要执行的操作。
例六、
[root@my127 awk]# awk ‘BEGIN{print “abc”,“def”} {print $0}’ 4.txt
abc def
root test prom tmp
123 456 78900 00
WWW GOO GLE COM
实例发现BEGIN操作在文本操作之前被执行,实际上即使不指定文本,awk也会执行BEGIN操作。
例子七、
[root@my127 awk]# awk 'BEGIN{print "aaa","bbb"}'
aaa bbb
同理,END模式就是在处理完所有的指定文本后,再执行指定的动作。
可以结合BEGIN和END一起看一下效果:
例子八、
[root@my127 awk]# awk 'BEGIN{print "qqq","www"} {print $0} END{print "zzz" , "xxx"}' 4.txt
qqq www
root test prom tmp
123 456 78900 00
WWW GOO GLE COM
zzz xxx
以上例子表明了AWK的将文本格式化成表格的能力,有表头,表内容,表尾。
例子九、
[root@my127 awk]# awk 'BEGIN{print "this is header!"} {print $0} END{print "this is tail!"}' 4.txt
this is header!
root test prom tmp
123 456 78900 00
WWW GOO GLE COM
this is tail!
第一篇手记主要讲述awk基本语法及原理,留作自己的笔记。
*****介绍几个较为常用的awk内置变量
内置变量NR+NF
NR表示行数,NF表示列数。
[root@my127 awk]# cat 4.txt
root test prom tmp
123 456 78900 00
WWW GOO GLE COM
[root@my127 awk]# awk '{print NR,NF}' 4.txt
1 4
2 4
3 4
[root@my127 awk]# awk '{print NR,$0}' 4.txt
1 root test prom tmp
2 123 456 78900 00
3 WWW GOO GLE COM
现在每一行开头都标有行号。
内置变量FNR
当awk处理多文件时,分别对各个文件行号计数。
[root@my127 awk]# awk '{print FNR,$0}' 4.txt 5.txt
1 root test prom tmp
2 123 456 78900 00
3 WWW GOO GLE COM
1 qaz wsx#edc rfv
2 123 456#789 098
3 tgb yhn#ujm iko