`
阅读更多

http://pengzhenloveseo.blog.163.com/blog/static/163156529201072535047651/

1、$0变量:它指的是整条记录。如$ awk '{print $0}' test将输出test文件中的所有记录。

2、变量NR:一个计数器,每处理完一条记录,NR的值就增加1。如$ awk '{print NR,$0}' test将输出test文件中所有记录,并在记录前显示记录号。

3、内建变量FS保存输入域分隔符的值,默认是空格或tab。我们可以通过-F命令行选项修改FS的值。如$ awk -F: '{print $1,$5}' test将打印以冒号为分隔符的第一,第五列的内容。

可以同时使用多个域分隔符,这时应该把分隔符写成放到方括号中,如$awk -F'[:\t]' '{print $1,$3}' test,表示以空格、冒号和tab作为分隔符。

4、匹配操作符(~)和不匹配操作符(!~),用来在记录或者域内匹配正则表达式。如$ awk '$1 ~/^root/' test将显示test文件第一列中以root开头的行。$ awk '$1!~/^root/' test将显示test文件第一列中不以root开头的行!

5、复合表达式
语法:(compound expression)

(expr1)&& (expr2)  ------- 与

(expr1)|| (expr2)  ------- 或

说明一下:符合表达式必须用括号括起来

当使用&&时,expr1和expr2必须同时为零(零代表真!呵呵~),复合表达式才为真;

当使用 || 时,expr1和expr2 只要有一个为真,复合表达式则为真!

6、举例:vi data.f(每列后是tab)
48 Dec 3BC1997 LPSX    68.00   LVX2A   138
483 Sept    5Ap1996 USP 65.00   LVX2C   189
47 Oct 3ZL1998 LPSX    43.00   KVM9D   512
219 dec 2CC1999 CAD 23.00   PLV2C   68
484 nov 7PL1996 CAD 49.00   PLV2C   234
483 may 5PA1998 USP 37.00   KVM9D   644
216 sept    3ZL1998 USP 86.00   KVM9E   234


下面的例子重定向输出到新文件:
awk '{print $0}' data.f > data.f.1
使用t e e命令,在输出到文件的同时输出到屏幕:
awk '{print $0}' data.f | tee data.f.2
打印信息头放置在BEGIN模式部分:
awk 'BEGIN {print "Name Belt\n---------------"}{print $1"\t"$4}' data.f
打印信息尾。E N D语句在所有文本处理动作执行完之后才被执行。E N D语句在脚本中的位置放置在主要动作之后:
awk 'BEGIN {print "Name Belt\n---------------"}{print $1"\t"$4} END {print "end-of-report"}' data.f

为使一域号匹配正则表达式,使用符号‘~’后紧跟正则表达式,也可以用i f语句。awk中i f后面的条件用()括起来。
如果第1域匹配483的话就把该记录打印出来:
awk '{if($1~/483/) print $0}' data.f
完成同一目的也可以这样写:
awk '$0~/483/' data.f
为精确匹配4 8,使用等号= =,并用单引号括起条件:
awk '{if($1=="48") print $0}' data.f
有时要浏览信息并抽取不匹配操作的记录,与~相反的符号是!~,意即不匹配:
awk '{if($1!~/483/) print $0}' data.f
完成同一目的也可以这样写:(缺省情况下, awk将打印所有匹配记录)
awk '$0!~/483/' data.f
为查询大小写信息,可使用[ ]符号。在测试正则表达式时提到可匹配[ ]内任意字符或单词:
awk '/[lL]PSX/' data.f
抽取名字,其记录第3域的第3个字符是L,使用句点.
awk '$3~/^..L/' data.f
使用竖线符|意为匹配| 两边模式之一。注意,使用竖线符时,语句必须用圆括号括起来:
awk '$0~/(USP|LPSX)/' data.f
复合表达式,&& AND,|| OR,!非:
awk '{if($1=="483" && $2~/^Sept/) print $0}' data.f

要快速查看记录个数,应使用NR。print NR放在E N D语法中:
awk 'END {print NR}' data.f
使用NF变量显示每一条读记录中有多少个域,并在END部分打印输入文件名:
awk '{print NR,NF,$0}END{print FILENAME}' data.f
至少存在一个记录后,查询字符串USP,最后打印结果:
awk '{if(NR>0&&$4~/USP/)print$0}' data.f
NF的一个强大功能是将变量$PWD的返回值传入awk并显示其目录。这里需要指定域分隔符/
echo $PWD | awk -F/ '{print $NF}'


设置输入域到域变量名:
awk '{no=$1;month=$2;if(no=="48") print no" month is " month}' data.f
修改数值域取值:
awk '{if($1=="48") $5=$5-10; print $1,$5,$6}' data.f
修改文本域:(要记住实际输入文件是不可修改的,修改的只是保存在缓存里的awk复本。awk会在变量N R或N F变量中反映出修改痕迹。)
awk '{if($2=="Dec") $2="December";print $0}' data.f
只显示修改记录:
awk '{if($2=="Dec") {$2="December";print $0}}' data.f
创建新的输出域:
awk 'BEGIN {print "No\tMonYear"} {if($2~/[Ss]ept/) {$8=$5-$7; print $2,$8}}' data.f
awk 'BEGIN {print "No\tMonYear"} {if($2~/[Ss]ept/) {diff=$5-$7; print $2,diff}}' data.f
列值增加很有用。许多文件都要求统计总数:
awk '(tol+=$5); END {print "Total money:" tol}' data.f
如果文件很大,你只想打印结果部分而不是所有记录,在语句的外面加上大括号{}即可:
awk '{(tol+=$5)}; END {print "Total money:" tol}' data.f
快速查看所有文件的长度及其总和,但要排除子目录:
ls -l | awk '/^[^d]/ {print $9"\t"$5} {tol+=$5} END {print "Total KB:"tol}'

分享到:
评论

相关推荐

    awk入门到精通.pdf

    《awk入门到精通》这本书是一本专为学习awk语言设计的指南,主要关注awk适用的问题类型和常用的解题策略。作者希望通过一系列具有代表性的实例,帮助读者快速掌握awk的使用技巧和特性。书中实例逐步深入,互相连贯,...

    ass109.awk

    2. **运行awk脚本**:将生成的trace文件作为"ass109.awk" 的输入,执行命令如`awk -f ass109.awk trace_file_name.trc`,脚本会解析文件并输出关键信息。 3. **分析结果**:"ass109.awk" 可能会输出SQL语句、等待...

    巧用AWK处理二进制数据文件

    "巧用AWK处理二进制数据文件" AWK是Unix、Linux中处理文本的好工具,可以对复杂的文本文件进行整理,提取其中的全部或者部分数据,按照需要的格式予以显示。但是,AWK的强大功能只针对纯文本文件,对于带有很多不可...

    Effective awk Programming, 4th Edition[awk高效编程4版]

    《Effective awk Programming, 4th Edition》是一本深入讲解awk编程技术的专业书籍,旨在帮助读者提升在文本处理和数据操作中的效率。awk是Unix/Linux环境中的一款强大工具,它专门用于处理结构化的文本数据,如日志...

    Sed与Awk (中文版)

    **sed和awk工具的介绍与应用** sed和awk是广泛应用于UNIX系统中的两个文本处理工具。sed是流编辑器(stream editor)的缩写,而awk则是一种编程语言,得名于其三位开发者:Alfred Aho、Peter J. Weinberger和Brian ...

    The AWK Programming Language 中文版

    AWK是一种非常实用的编程语言,它在文本处理和数据分析方面表现出色。它的特点是编写程序非常简单,即便是只有一两行的程序也能完成复杂的任务。AWK非常适合那些需要快速解决特定数据处理问题的场景。 ### AWK程序...

    awk详细用法小结awk awk

    ### awk详细用法小结 #### 一、awk简介与版本 awk是一种强大的文本分析工具,主要用于Linux/Unix系统下的数据处理与报告生成。它支持正则表达式、模式匹配和复杂的文本处理功能,是系统管理员和程序员进行数据处理...

    MOXA_AWK-3121配置方法及要点说明

    MOXA AWK-3121 配置方法及要点说明 MOXA AWK-3121 是一种工业级无线设备,具有 web 功能配置、IP 网络参数设置、工作模式选择、功率增强等特点。本文将详细介绍 MOXA AWK-3121 的配置方法及要点说明。 一、Web ...

    awk参考资料下载awk

    【awk参考资料】深入理解awk awk是一种强大的文本分析工具,主要在Linux/Unix环境中使用,由Alfred Aho、Brian Kernighan和Peter Weinberger三位大师共同开发。它能够处理来自标准输入、文件或命令输出的数据,通过...

    SED与AWK 高清第三版

    《SED与AWK 高清第三版》是一本专注于Linux系统中强大文本处理工具sed和awk的教程。在Linux环境中,sed和awk是不可或缺的工具,它们能够高效地处理大量文本数据,进行搜索、替换、格式化等操作,极大地提高了运维...

    Oracle ass.awk工具

    ass.awk工具用在数据库hang住时分析收集到的systemstate所用,可以清晰明了的查看systemstate中的信息; 命令简单: $ awk -f ass1033.awk [trace_name_file] 在系统hung的时候,systemstate基本等同于hanganalyze...

    awk教程-awk教程.rar

    **awk命令详解** awk是一种强大的文本分析工具,广泛应用于Linux和Unix系统中,用于处理结构化数据,如CSV、TSV格式的文件。它通过模式匹配和动作来处理输入流中的每一行,允许用户定制复杂的文本处理逻辑。下面将...

    AWK实例教程 AWK实例教程中文版

    ### AWK实例教程知识点解析 #### 一、AWK简介及背景 - **AWK**是一种功能强大的文本处理工具,最初由贝尔实验室的Alfred Aho、Peter Weinberger和Brian Kernighan共同开发,因此得名AWK。尽管这个名字听起来有些...

    awk入门级教材awk入门awk入门

    ### awk入门级教材知识点详解 #### 一、awk简介 **awk** 是一种强大的文本处理工具,主要用于在一组文件上查找符合特定模式的行或字段,并执行相应的操作。它简化了数据选择和转换的过程,使其变得更为直观和简单...

    sed and awk 101 hacks.pdf

    Sed和Awk是UNIX和Linux系统中极为重要的流编辑器和文本处理工具,它们能够通过简单的命令或脚本高效处理文本文件,实现复杂的文本转换和报告生成。接下来,我们将根据提供的文件内容详细地说明Sed和Awk的关键知识点...

    Sed与awk第二版(中文高清版)

    在处理文本数据时,Sed和awk是两个非常强大的工具。它们广泛应用于Unix和类Unix系统中,比如Linux。Sed,即流编辑器,是一个非交互式的文本处理工具,它能够执行文本替换、插入、删除等操作,而awk则是一个强大的...

Global site tag (gtag.js) - Google Analytics