html tool

2014年7月24日星期四

awk 与 sed 之 awk1 学习笔记

add:http://kodango.com/tag/sed-and-awk/  转自: 团子的小窝 , 本文固定链接: Sed and awk 笔记之 awk 篇:快速了解 Awk(一)

使用Awk,我们可以做以下事情:
将文本文件视为由字段和记录组成的文本数据库; [popexizhi:此喻甚佳,awk之用为文本字符之sql :),下列为此喻之上,系统性很强,赞一个]
在操作文本数据库的过程中能够使用变量;
能够使用数学运算和字符串操作
能够使用常见的编程结构,例如条件分支与循环;
能够格式化输出;
能够自定义函数;
能够在awk脚本中执行UNIX命令;
能够处理UNIX命令的输出结果;


basic
-F
通过-F参数设置冒号:为分隔符,并打印各个字段     
$ echo "1:2:3" | awk -F: '{print $1 " and " $2 " and " $3}'
1 and 2 and 3
-v
-v 设置变量
$ echo | awk -v a=1 'BEGIN {print a}'
1
PS:-v选项的赋值操作在BEGIN动作之前就执行
$ echo 1 | awk -v var=a 'BEGIN {print "BEGIN: " var}'
BEGIN: a

BEGIN/END
BEGIN是一个特殊的pattern,它在awk处理输入之前就会执行,可以认为是一个初始化语句,与此对应的还有END

变量定义与文件的位置
文件名
-
awk可以同时指定多个输入文件,如果输入文件的文件名为'-',表示从标准输入读取内容
顺序
文件内容
>cat a
file a
>cat b
file b

变量定义在filename前
$ awk 'BEGIN {print "BEGIN: " var} {print "PROCESS: " var} END {print "END: " var }' var=1 a
BEGIN:
PROCESS: 1
END: 1
变量定义在filename后
$ awk 'BEGIN {print "BEGIN: " var} {print "PROCESS: " var} END {print "END: " var }' a var=1 
BEGIN:
PROCESS:
END: 1
赋值操作发生在正常处理之后,END动作之前。
变量赋值一定要小心不要与保留关键字重名,否则会报错,可以查看awk的man手册查询哪些是保留关键字
变量定义在filename之间
$ awk 'BEGIN {print "BEGIN: " var} {print "PROCESS: " var} END {print "END: " var }' a var=1 b
BEGIN:
PROCESS:
PROCESS: 1
END: 1
赋值操作发生在处理前面的文件之后,并且位于处理后面的文件之前


总结
总结如下:
如果变量赋值在第一个文件参数之前,在BEGIN动作之后执行,影响到正常处理和END动作;
如果变量赋值在最后一个文件参数之后,在END动作之前执行,仅影响END动作;
如果文件参数不存在,情况同1所述;
如果变量赋值位于多个文件参数之间,在变量赋值前面的文件被处理后执行,影响到后续文件的处理和END动作;     

没有评论:

发表评论