awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。
awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk有3个不同版本号: awk、nawk和gawk,未作特别说明,一般指gawk。
awk程序的报告生成能力通经常使用来从大文本文件里提取数据元素并将它们格式化成可读的报告。最完美的样例是格式化日志文件。
awk的用法 awk 'BEGIN{ commands } pattern{ commands } END{ commands }'第一步:运行BEGIN{ commands }语句块中的语句。
第二步:从文件或标准输入(stdin)读取一行。然后运行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行反复这个过程。直到文件所有被读取完成。
第三步:当读至输入流末尾时。运行END{ commands }语句块。
BEGIN语句块在awk開始从输入流中读取行之前被运行,这是一个可选的语句块,比方变量初始化、打印输出表格的表头等语句通常能够写在BEGIN语句块中。
END语句块在awk从输入流中读取全然部的行之后即被运行。比方打印全部行的分析结果这类信息汇总都是在END语句块中完毕,它也是一个可选语句块。
pattern语句块中的通用命令是最重要的部分,它也是可选的。假设没有提供pattern语句块,则默认运行{ print },即打印每个读取到的行。awk读取的每一行都会运行该语句块。
这三个部分缺少任何一部分都可以。
内建变量列出某个目录的文件:
[root@localhost profile.d]# ls -lh total 136K -rwxr-xr-x 1 root root 766 Jul 22 2011 colorls.csh -rwxr-xr-x 1 root root 727 Jul 22 2011 colorls.sh -rw-r--r-- 1 root root 92 Feb 23 2012 cvs.csh -rwxr-xr-x 1 root root 78 Feb 23 2012 cvs.sh -rwxr-xr-x 1 root root 192 Mar 25 2009 glib2.csh -rwxr-xr-x 1 root root 192 Mar 25 2009 glib2.sh -rw-r--r-- 1 root root 218 Jun 6 2013 krb5-devel.csh -rw-r--r-- 1 root root 229 Jun 6 2013 krb5-devel.sh -rw-r--r-- 1 root root 218 Jun 6 2013 krb5-workstation.csh -rw-r--r-- 1 root root 229 Jun 6 2013 krb5-workstation.sh -rwxr-xr-x 1 root root 3.0K Feb 22 2012 lang.csh -rwxr-xr-x 1 root root 3.4K Feb 22 2012 lang.sh -rwxr-xr-x 1 root root 122 Feb 23 2012 less.csh -rwxr-xr-x 1 root root 108 Feb 23 2012 less.sh -rwxr-xr-x 1 root root 97 Mar 6 2011 vim.csh -rwxr-xr-x 1 root root 293 Mar 6 2011 vim.sh -rwxr-xr-x 1 root root 170 Jan 7 2007 which-2.sh试一下awk的使用
ls -lh | awk '{print $1}'在这里awk 后面没有BEGIN和END,跟着的是pattern,也就是每一行都会经过这个命令,在awk中$n,表示第几列,在这里表示打印每一行的第一列。
$0 当前记录(这个变量中存放着整个行的内容)
$1~$n 当前记录的第n个字段,字段间由FS分隔
FS 输入字段分隔符 默认是空格或Tab
NF 当前记录中的字段个数,就是有多少列
NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
RS 输入的记录分隔符, 默认为换行符
OFS 输出字段分隔符, 默认也是空格
ORS 输出的记录分隔符,默认为换行符
FILENAME 当前输入文件的名字