Awk学习笔记

合集下载

awk学习笔记

awk学习笔记

awk学习笔记awk学习笔记一、awk简介awk是一种编程语言,主要用于union/linux下的文本和数据处理。

它在命令行中使用,但更多是当作脚本使用。

gawk 是awk的GNU版本,它对awk进行了扩展。

二、语法(一)命令1.形式awk [options] …{pattern + action}? {filenames}其中pattern 表示AWK 在数据中查找的内容,而action 是在找到匹配内容时所执行的一系列命令。

花括号({}) 不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。

2. 选项-F fs or --field-separator fs指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。

-v var=value or --asign var=value赋值一个用户定义变量。

-f scripfile or --file scriptfile从脚本文件中读取awk命令。

-mf nnn and -mr nnn对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。

这两个功能是Bell 实验室版awk的扩展功能,在标准awk中不适用。

-W compact or --compat, -W traditional or --traditional在兼容模式下运行awk。

所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。

-W copyleft or --copyleft, -W copyright or --copyright打印简短的版权信息。

-W help or --help, -W usage or --usage打印全部awk选项和每个选项的简短说明。

-W lint or --lint打印不能向传统unix平台移植的结构的警告。

-W lint-old or --lint-old打印关于不能向传统unix平台移植的结构的警告。

awk的学习和使用(一)

awk的学习和使用(一)

awk的学习和使用(一)最近接触了linux的使用和一些命令、工具的使用,awk恐怕是linux用处最广的工具之一了,今天开始,我打算记录下我的学习过程。

一.awk的简介与sed和grep很相似,awk是一种样式扫描与处理工具,其功能远远强于sed和grep,除了几乎所有的sed和grep功能之外,awk 还可以进行样式装入,流控制,数学运算符,进程控制语句,甚至内置的变量和函数。

它具备了一个完整的语言所应具备的特性,实际上awk确实拥有自己的语言,awk程序设计语言,awk的三位创建者已将其定义为:awk样式扫描和处理语言。

基于文本的样式扫描和处理是我们经常要做的工作,比如从一个上千行的具有一定格式的文本文件中找出满足要求的行并输出到一个新文本,就可以使用awk。

再比如,监控网络时,由于网络上流动的数据非常多,如果需要获得某些特定的数据,使用awk过滤。

简而言之,awk就是一个强大的文本处理工具。

在这里有一个可遵循的一般原则:如果你用普通的shell工具或shell script有困难的话,试试awk,如果awk仍不能解决问题,则便用C语言,如果C语言仍然失败,则移至C++。

二.awk的调用方式1.awk命令行的方式,适用于解决简单问题,例如:打印testfile 文本中第一列为abc的所有行(省略了print)2.使用-f选项调用awk程序文件,例如:将一段awk程序保存到文本,名为testawk1,在命令行中执行该文件3.利用命令解释器调用awk,例如:将一段awk程序保存至文本,名为myawk,与前面不同的是该文本首行需要添加:#!/bin/awk -f ,保存后赋予该文件执行权限,命令行中直接调用:三.awk语法awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...]-F re: 允许awk更改其字段分隔符。

Linux三剑客之awk精讲(基础与进阶)

Linux三剑客之awk精讲(基础与进阶)

Linux三剑客之awk精讲(基础与进阶)标签(空格分隔):Linux实战教学笔记-陈思齐快捷跳转目录:* 第1章:awk基础入门* 1.1:awk简介* 1.2:学完awk你可以掌握:* 1.3:awk环境简介* 1.4:awk的格式* 1.5:模式动作* 1.6:awk的执行过程 * 1.6.1:小结awk执行过程* 1.7:记录和字段* 1.7.1:记录(行)* 1.7.2:记录分隔符-RS * 1.7.3:对$0的认识* 1.7.4:企业面试题* 1.7.5:awk记录知识小结* 1.7.6:字段(列)* 1.7.7:ORS与OFS简介* 1.9:awk基础入门总结* 第2章:awk进阶* 2.1:awk模式与动作 * 2.2:正则表达式作为模式* 2.2.1:awk正则匹配操作符* 2.2.2:awk正则表达式匹配整行* 2.2.3:awk正则表达式匹配一行中的某一列* 2.2.4:某个区域中的开头和结尾* 2.2.5:创建测试环境* 2.2.6:测试文件说明* 2.2.7:awk正则表达式练习题* 2.2.8:awk正则表达式练习题-详解* 2.2.9:企业面试题* 2.2.10:明明白白扩展正则表达式:+(加号)* 2.2.11:awk正则之{} -花括号* 2.2.12:企业案例1 * 2.2.13:企业案例2 * 2.3:比较表达式做为模式-需要一些例子* 2.3.1:企业面试题* 2.3.2:如果判断某一列是否等于某个字符呢?* 2.4:范围模式* 2.5:awk特殊模式-BEGIN模式与END模式* 2.5.1:BEGIN模块* 2.5.2:awk中变量的概念简介* 2.5.3:END模块 * 2.6:awk中的动作* 2.7:awk模式与动作小结* 2.8:总结awk执行过程* 2.9:awk数组* 2.10:图片-数组第1章awk基础入门要弄懂awk程序,必须熟悉了解这个工具的规则。

SHELL学习AWK入门 电脑资料

SHELL学习AWK入门 电脑资料

shell学习awk入门电脑资料
一. awk应用场景
格式化数据或从一个大的文本文件中抽取记录
二. 使用方法
命令行方式
$awk [-F field-separator] ‘mands’ input-file(s)
mands是真正的awk命令
[-F域分割符]是可选的,如果无-F选项,awk默认用空格作为分隔符,如果域分隔符不为空格,比方要浏览以”:”作为分隔符的password文件那么必须指明-F选项,如:
awk -F: ‘mands’ input-file
awk脚本文件
将1中的命令行写入一个文件,用bash或sh去解释它,执行命令为shawkscriptfile或 ./awkscriptfile, 后者需要给脚本文件加执行权限,
将所有awk命令写入一个文件awkscriptfile,用$awk -f awkscriptfile input-file(s),例如,
三. awk脚本组成
awk语句都是由模式和动作组成。

域即用分隔符分割的字段,用$1,$2,$3...,$n表示第一个、第二个、第三个,第n个字段, $0表示所有字段。


变量提高了awk程序可读性,下面是变量使用的简单例子
本文只是简单的介绍了awk的根本语法,阅读本文后可以用awk完成简单的文本处理功能,awk博大精深,如果要深入学习建议阅读更专业的awk文档和相关书籍,
模板,内容仅供参考。

Linux入门培训教程 linux awk 正则表达式、正则运算符详细介绍

Linux入门培训教程  linux awk 正则表达式、正则运算符详细介绍

Linux入门培训教程linuxawk 正则表达式、正则运算符详细介绍使用awk作为文本处理工具,正则表达式是少不了的。

要掌握这个工具的正则表达式使用。

其实,我们不必单独去学习它的正则表达式。

正则表达式就像一门程序语言,有自己语法规则已经表示意思。

对于不同工具,其实大部分表示意思相同的。

在linux众多文本处理工具(awk,sed,grep,perl)里面用到正则表达式。

其实就只有3种类型。

详细可以参考:linux shell 正则表达式(BREs,EREs,PREs)差异比较。

只要是某些工具是属于某种类型的正则表达式。

那么它的语法规则基本一样。

通过那篇文章,我们知道awk 的正则表达式,是属于:扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称EREs)。

一、awk Extended Regular Expression (ERES)基础表达式符号介绍字符功能+指定如果一个或多个字符或扩展正则表达式的具体值(在 +(加号)前)在这个字符串中,则字符串匹配。

命令行:awk '/smith+ern/' testfile将包含字符 smit,后跟一个或多个 h 字符,并以字符 ern 结束的字符串的任何记录打印至标准输出。

此示例中的输出是:smithern, harry smithhern, anne?指定如果零个或一个字符或扩展正则表达式的具体值(在 ?(问号)之前)在字符串中,则字符串匹配。

命令行:awk '/smith?/' testfile将包含字符 smit,后跟零个或一个 h 字符的实例的所有记录打印至标准输出。

此示例中的输出是:smith, alansmithern, harry smithhern, annesmitters, alexis|指定如果以 |(垂直线)隔开的字符串的任何一个在字符串中,则字符串匹配。

Linux运维学习之awk范围模式简析

Linux运维学习之awk范围模式简析

Linux运维学习之awk范围模式简析
Linux运维基础学习中,关于awk了解多少呢?咱们今天就来简单了解下awk的范围模式。

Ø范围模式简单理解就是从哪里来(条件1),到哪里去(条件2)。

Ø匹配从条件1开始到条件2介绍的范围。

1)awk的范围模式,与sed类似但又有所不同,awk不能直接使用行号来作为范围起始地址,因为awk具有内置变量NR来存储记录号,所有需要使用NR=1,NR=5这样来使用。

2)范围模式处理的原则是:先匹配从第一个模式的首次出现到第二个模式的首次出现之间的内容,执行action。

然后匹配从第一个模式的下一次出现到第二个模式的下一次出现,直到文本结束。

如果匹配到第一个模式而没有匹配到第二个模式,则awk处理从第一个模式开始直到文本结束全部的行。

如果第一个模式不匹配,就算第二个模式匹配,awk依旧不处理任何行。

awk '/start pos/,/end pos/{print $)} passwd oldboy'
awk '/start pos/,NR==XXX{print $0}' passwd oldboy
范围模式的时候,范围条件的时候,表达式必须能匹配一行。

以上就是今天的分享了,希望对有需要的朋友有所帮助。

Awk学习笔记2010修改版

Awk学习笔记2010修改版

AWK学习笔记 (1)1.AWK简介 (1)2.AWK编程模型 (2)3. 常量与转义符 (3)4. 变量 (3)4.1用户定义变量 (3)4.2系统变量 (4)4.3字段变量 (4)5 数组 (5)6 操作符 (5)7 流程控制 (6)8 函数 (7)8.1 算术函数 (7)8.2 字符串函数 (7)8.3 字节处理函数 (8)8.4 时间函数 (8)8.5 用户自定义函数 (9)9 输入输出 (9)9.1 输入 (9)9.2 输出 (10)10 总结 (10)11. 参考文献 (10)AWK学习笔记1.AWK简介AWK是Alfred V.Aho, Peter J.Weinberger,Brian W.Kerninghan三人在1977设计和实施的,最初是为了试验Unix中的grep和sed工具怎样可以一般化地在文本之外还能处理数据(grep和sed主要是文本处理工具,但AWK同时善于处理文本与数据)。

AWK名字的来源是创造此语言的三个人的名字首字母缩写。

它的主要来源是grep, sed和C。

后继者主要有Perl。

AWK非常适合于处理格式化的文本和数据,比如改变数据的格式、验证其合法性、寻找某些属性的项、数字求和、输出数据报表等。

数据的结构化越强,使用AWK会越方便。

相比于sed,它有字段(sed只有行而没有内置的字段模型)和数字处理功能。

相比于C和Perl,由于它自动化了某些处理流程(比如读取文件和分割字段),可以使得某些任务以比C 和Perl少得多的代码来完成。

AWK(相对于Perl)的不足:一是各种复杂的数据结构难以实现;二是对Unicode的支持不好。

2.AWK编程模型AWK程序的基本使用语法如下:awk[-v var=value] -Fre'pattern{ action}' var=value datafile(s)awk[-v var=value] -Fre-f scriptfile var=value datafile(s)用命令行与用脚本文件(scriptfie)是等价的。

《Mastering Regular Expressions》---学习笔记

《Mastering Regular Expressions》---学习笔记

近段涉及到了数据的解析,自然离不开对Regular Expressions(正则表达式)的温习;在jdk 官方源码中看到了对《Mastering Regular Expressions, 2nd Edition》的推荐;由Jeffrey E.F. Friedl大师主刀,O'Reilly于2002年再版。

对O'Reilly的书向有好感,像当年误入java的歧途,没看Java编程思想之类的,倒看了O'Reilly的一本影印版《java in a nutshell》,颇留记忆。

正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。

Warren McCulloch 和Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。

1956 年, 一位叫Stephen Kleene 的数学家在McCulloch 和Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。

正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。

随后,发现可以将这一工作应用于使用Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是Unix 的主要发明人。

正则表达式的第一个实用应用程序就是Unix 中的qed 编辑器。

目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统;PHP,Perl,Python,C#,Java等开发环境,以及很多的应用软件中,For Example:网络上的搜索引擎,数据库的全文检索etc...本笔记是是自我学习过程的一个整理,例子或来源于书本,或自己枚举。

好了,废话一箩筐,切入正题。

1.正则表达式的介绍1.1、行开始和结束^begin line。

匹配行开头,如^cat匹配以cat开头的$end line。

30分钟学会AWK

30分钟学会AWK

30分钟学会AWK来源:伯乐在线 - mylxsw如需转载,请发送「转载」二字查看详情;本文大部分内容翻译自我开始学习AWK时看到的一篇英文文章AWK Tutorial ,觉得对AWK入门非常有帮助,所以对其进行了粗略的翻译,并对其中部分内容进行了删减或者补充,希望能为对AWK感兴趣的小伙伴提供一份快速入门的教程,帮助小伙伴们快速掌握AWK 的基本使用方式,当然,我也是刚开始学习AWK,本文在翻译或者补充的过程中肯定会有很多疏漏或者错误,希望大家能够帮忙指正。

本文将会持续修正和更新,最新内容请参考我的 GITHUB 上的程序猿成长计划项目,欢迎 Star。

概述AWK是一门解释型的编程语言。

在文本处理领域它是非常强大的,它的名字来源于它的三位作者的姓氏:Alfred Aho,Peter Weinberger 和 Brian Kernighan。

GNU/Linux发布的AWK目前由自由软件基金会(FSF)进行开发和维护,通常也称它为 GNU AWK。

AWK的类型下面是几个AWK的变体:•AWK –原先来源于 AT & T 实验室的的AWK•NAWK – AT & T 实验室的AWK的升级版•GAWK –这就是GNU AWK。

所有的GNU/Linux发布版都自带GAWK,它与AWK和NAWK完全兼容AWK的典型用途使用AWK可以做很多任务,下面是其中一些•文本处理•输出格式化的文本报表•执行算数运算•执行字符串操作等等工作流要成为AWK编程专家,你需要先知道它的内部实现机制,AWK 遵循了非常简单的工作流–读取,执行和重复,下图描述了AWK的工作流。

ReadAWK从输入流(文件,管道或者标准输入)中读取一行,然后存储到内存中。

Execute所有的AWK命令都依次在输入上执行。

默认情况下,AWK会对每一行执行命令,我们可以通过提供模式限制这种行为。

Repeat处理过程不断重复,直到到达文件结尾。

awk命令、awk编程语言详细介绍和实例

awk命令、awk编程语言详细介绍和实例

awk命令、awk编程语⾔详细介绍和实例⼀,什么是awkawk是linux下的⼀个命令,他对其他命令的输出,对⽂件的处理都⼗分强⼤,其实他更像⼀门编程语⾔,他可以⾃定义变量,有条件语句,有循环,有数组,有正则,有函数等。

他读取输出,或者⽂件的⽅式是⼀⾏,⼀⾏的读,根据你给出的条件进⾏查找,并在找出来的⾏中进⾏操作,感觉他的设计思想,真的很简单,但是结合实际情况,具体操作起来就没有那么简单了。

他有三种形势,awk,gawk,nawk,平时所说的awk其实就是gawk。

⼆,awk中的记录,域,分割符当我们读取输出时,或者读取⽂件时,读取⼀⾏就是⼀个记录。

记录分割符是默认是回车符,保存在RS,ORS中。

我们从记录中分割出我们要单词,或者是词组等,我们称他为域,域分割符,默认的是空格和TAB銉,保存在内建变量ORS中。

举个例⼦:aaaa:bbbb:ccccccc1111:2343:5t43343上⾯有⼆⾏,这⼆⾏就是⼆个记录,每⾏后⾯的回车呢,就是记录分割符,⾥⾯冒号呢,就是域分割符,分割出来的,aaaa,1111这类东西就是域了。

awk -F: '{print $1}' testfile三,awk的内建变量和运算符1,变量变量描述$n当前记录的第n个字段,字段间由 FS分隔。

$0完整的输⼊记录。

ARGC命令⾏参数的数⽬。

ARGIND命令⾏中当前⽂件的位置(从0开始算)。

ARGV包含命令⾏参数的数组。

CONVFMT数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组。

ERRNO最后⼀个系统错误的描述。

FIELDWIDTHS字段宽度列表(⽤空格键分隔)。

FILENAME当前⽂件名。

FNR同 NR,但相对于当前⽂件。

FS字段分隔符(默认是任何空格)。

IGNORECASE如果为真,则进⾏忽略⼤⼩写的匹配。

NF当前记录中的字段数。

NR当前记录数。

OFMT数字的输出格式(默认值是%.6g)。

Linux文本处理三剑客之awk学习笔记03:读取文件

Linux文本处理三剑客之awk学习笔记03:读取文件

Linux文本处理三剑客之awk学习笔记03:读取文件读取文件读取“每行”数据博客的开头我们说过,默认情况下awk读取文件的每行数据并将其存入$0变量当中。

其实,awk在读取数据之前会根据其内部的预定义变量RS的值来分隔每条记录(record)。

RS的默认值是“\n”,即换行符,因此也就会有我们刚才所说的默认情况。

所以,awk在读取文件时,会根据其自定义变量RS(Record Separator,记录分隔符)的值将文件分为多条记录来循环读取,每读取一条记录就将其赋值给$0变量,赋值完毕后再执行main代码块。

如果文件是一个空文件,那么就读取不到记录也就不会执行main 代码块。

[root@c7-server ~]# touch x.log[root@c7-server ~]# awk '{print "hello world"}' x.log[root@c7-server ~]#可以在BEGIN代码块中设置RS的值来改变awk分隔记录的方式。

[root@c7-server ~]# awk 'BEGIN{RS="com"}{print "---";print $0;print "---"}' a.txt---ID name gender age email phone1 Bob male 28 abc@qq.------180****40122 Alice female 24 def@gmail.---... ...被分隔的每条记录中不会包含RS的值本身,在上述示例中即每条记录不会包含com字符串。

细心的朋友会留意到~]# awk '{print $0}' a.txt当我们不修改RS,上述指令在输出的时候会使得每条记录之间自动换行,看起来就好像输出数据包含了换行符(RS的默认值)。

awk读书笔记整理

awk读书笔记整理

目录1什么是awk、nawk、gawk (4)1.1awk简介 (4)1.2awk版本 (4)2awk的格式 (4)2.1.1 从文件输入 (5)2.1.2 从管道(命令)输入 (5)3awk工作原理 (6)4格式化输出 (7)4.1print函数 (7)4.2OFMT变量 (8)4.3printf函数 (8)5文件中的awk命令 (9)6记录与字段 (10)6.1 记录 (10)6.1.1 记录分隔符 (10)6.1.2 变量$0 (10)6.1.3 变量NR (10)6.2 字段 (11)6.3 字段分隔符 (11)6.3.1 输入字段分隔符 (11)6.3.2 从命令行改变字段分隔符 (11)6.3.3 使用多个字段分隔符 (12)6.3.4 输出字段分隔符 (12)7模式与操作 (12)7.1 模式 (12)7.2 操作 (13)8正则表达式 (13)8.1匹配整行 (14)8.2匹配操作符~ (15)9阶段复习 (15)9.1简单的模式匹配 (16)9.2简单的操作 (16)9.3操作与模式组合的正则表达式 (17)9.4输入字段分隔符 (18)9.5编写awk脚本 (20)10比较表达式 (21)10.1关系运算符 (21)10.2条件表达式 (22)10.3算术运算 (23)10.4逻辑操作符和复合模式 (23)10.5范围模式 (24)11变量 (25)11.1数值变量和字符串变量 (25)11.2用户自定义变量 (25)11.2.1格式 (25)11.2.2命令行上的用户自定义变量 (26)11.2.3字段变量 (26)11.2.4内置变量 (26)11.2.5 BEGIN模式 (28)11.2.6 END模式 (28)12重定向和管道 (29)12.1 重定向 (29)12.1.1 输出重定向 (29)12.1.2 输入重定向 (29)12.2 管道 (30)12.2.1 打开管道 (30)12.2.2 关闭文件和管道 (31)12.2.3 system函数 (31)13条件语句 (32)13.1 if语句 (32)13.2 if/else语句 (32)13.3 if/else和else if语句 (33)14循环 (33)14.1 while循环 (33)14.2 for循环 (33)14.3 循环控制break/continue语句 (34)15程序控制语句 (34)15.1 next语句 (34)15.2 exit语句 (34)16数组 (35)16.1关联数组的下标 (35)16.1.1 特殊for循环 (35)16.1.2 用字符串作为数组下标 (36)16.1.3 用字段的值作为数组下标 (37)16.1.4 多维数组 (37)17awk的内置函数 (38)17.1 字符串函数 (38)17.1.1 sub和gsub函数 (38)17.1.2 index函数 (39)17.1.3 length函数 (39)17.1.4 substr函数 (40)17.1.5 match函数 (40)17.1.6 split函数 (40)17.1.7 sprintf函数 (41)17.1.8 toupper和tolower函数 (41)17.2 算术函数 (41)17.3 时间函数 (42)17.3.1 systime (42)17.3.2 strftime (42)17.4 命令行参数 (43)17.5 读输入getline (44)17.6 控制函数 (44)17.7 用户自定义函数 (44)17.8 awk/gawk命令行选项 (45)awk读书笔记整理1什么是awk、nawk、gawkawk是一种用于处理数据和生成报告的UNIX编程语言。

awk学习笔记

awk学习笔记

shell echo 知多少-n, -e 主要是参数3) 別人echo、你也echo ,是問echo 知多少?承接上一章所介紹的 command line ,這裡我們用echo 這個命令加以進一步說明。

溫習---標準的command line 包含三個部件:* command_name option argumentecho 是一個非常簡單、直接的Linux 命令:* 將argument 送出至標準輸出(STDOUT),通常就是在監視器(monitor)上輸出。

(註:stdout 我們日後有機會再解說,或可先參考如下討論:/forum/viewtopic.php?t=191375 )為了更好理解,不如先讓我們先跑一下echo 命令好了:1.$ echo2.3.$复制代码你會發現只有一個空白行,然後又回到shell prompt 上了。

這是因為echo 在預設上,在顯示完argument 之後,還會送出一個換行符號(new-line charactor)。

但是上面的command 並沒任何的argument ,那結果就只剩一個換行符號了...若你要取消這個換行符號,可利用echo 的-n option :1.$ echo -n2.$复制代码不妨讓我們回到command line 的概念上來討論上例的echo 命令好了:* command line 只有command_name(echo) 及option(-n),並沒有任何argument 。

要想看看echo 的argument ,那還不簡單﹗接下來,你可試試如下的輸入:1.$ echo first line2.first line3.$ echo -n first line4.first line $复制代码於上兩個echo 命令中,你會發現argument 的部份顯示在你的熒幕,而換行符號則視-n option 的有無而別。

很明顯的,第二個echo 由於換行符號被取消了,接下來的shell prompt 就接在輸出結果同一行了...^_^事實上,echo 除了-n options 之外,常用選項還有:-e :啟用反斜線控制字符的轉換(參考下表)-E:關閉反斜線控制字符的轉換(預設如此)-n :取消行末之換行符號(與-e 選項下的\c 字符同意)關於echo 命令所支援的反斜線控制字符如下表:\a:ALERT / BELL (從系統喇叭送出鈴聲)\b:BACKSPACE ,也就是向左退格鍵\c:取消行末之換行符號\E:ESCAPE,跳脫鍵\f:FORMFEED,換頁字符\n:NEWLINE,換行字符\r:RETURN,回車鍵\t:TAB,表格跳位鍵\v:VERTICAL TAB,垂直表格跳位鍵\n:ASCII 八進位編碼(以x 開首為十六進位)\\:反斜線本身(表格資料來自O'Reilly 出版社之Learning the Bash Shell, 2nd Ed.) 或許,我們可以透過實例來了解echo 的選項及控制字符:例一:1.$ echo -e "a\tb\tc\nd\te\tf"2. a b c3. d e f复制代码上例運用\t 來區隔abc 還有def ,及用\n 將def 換至下一行。

关于Linux下的AWK入门教程

关于Linux下的AWK入门教程

关于Linux下的AWK入门教程本文主要是给使用Linux系统的新手介绍AWK的~那么下面就跟着店铺一起学习AWK吧:简介awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。

简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。

awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和Brian Kernighan 姓氏的首个字母。

实际上 AWK 的确拥有自己的语言: AWK 程序设计语言,三位创建者已将它正式定义为“样式扫描和处理语言”。

它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

使用方法awk '{pattern + action}' {filenames}尽管操作可能会很复杂,但语法总是这样,其中pattern 表示AWK 在数据中查找的内容,而action 是在找到匹配内容时所执行的一系列命令。

花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。

pattern就是要表示的正则表达式,用斜杠括起来。

awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。

完整的awk 脚本通常用来格式化文本文件中的信息。

通常,awk是以文件的一行为处理单位的。

awk每接收文件的一行,然后执行相应的命令,来处理文本。

调用awk有三种方式调用awk1.命令行方式awk [-F field-separator] 'commands' input-file(s)其中,commands 是真正awk命令,[-F域分隔符]是可选的。

awk命令学习笔记

awk命令学习笔记

awk命令学习笔记awk简介:一种名字怪异的语言,模式扫描和处理,处理streameditor文本流,水流。

awk不仅仅是linux中的一个命令,而且是一种编程语言,可以用来处理和生成报告。

处理的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取标准输入,可以在命令行直接编辑命令进行操作,也可以编写成awk程序进行更为复杂的应用。

学完本章你会了解:域(字段)与记录模式匹配基本的awk执行过程awk常用的内置变量(预定义变量)awk数组(工作常用)awk语法:循环,条件awk常用函数:print向向awk传递参数awk引用shell变量awk编程本书涉及的awk为为gawk,即即GNU版本的awk版本:区域和记录:1bash4bin1nologin3root1sbin2x124bin3root2x1sbin1nologin例:记录小节:1、、NR,NF,$数字,配合调试awk命令2、、NRnumberofrecord存放着每个记录的号(行号),读取新行时会自动+13、、RS是记录的分隔符,简单理解就是可以指定每个记录的结尾标志4、、可以用RS替换\n5、、RS的作用就是表示一个记录的结束6、、FS标识着每个区域的结束字段小结:1、$表示取区域,$1,$2192.168.0.1031root/bin/bash2bin/sbin/nologin4adm/sbin/nologin5lp/sbin/nologin6sync/bin/ sync8halt/sbin/halt9mail/sbin/nologin10uucp/sbin/nologin--posix表示使用了元字符,匹配时使用了{},!~表示取反1root:x:0:0:root:/root:/bin/bash4adm:x:3:4:adm:/var/adm:/sbi n/nologin||表示第一行和第4行1root:x:0:0:root:/root:/bin/bash2bin:x:1:1:bin:/bin:/sbin/no login3daemon:x:2:2:daemon:/sbin:/sbin/nologin两种表范围的方式也可以混合使用抓取服务的端口号:BEGIN模块:awk需要先执行完BEGIN模式,才对输入文件做处理,常用来修改内置变量,ORS,RS,FS,OFS的值可以不输入文件就测试BEGIN:例:helloworldroot***0bin***1daemon***2adm***3lp***4sync***5shutdown***6ha lt***7mail***8uucp***10通过BEGIN模式来更改FS和和OFS的值;BEGIN模式的操作如果有两个以上的语句,需要用冒号分隔。

awk定义及用法详解

awk定义及用法详解

什么是awk?你可能对UNIX比较熟悉,但你可能对awk很陌生,这一点也不奇怪,的确,与其优秀的功能相比,awk还远没达到它应有的知名度。

awk是什么?与其它大多数UNIX命令不同的是,从名字上看,我们不可能知道awk的功能:它既不是具有独立意义的英文单词,也不是几个相关单词的缩写。

事实上,awk是三个人名的缩写,他们是:Aho、(Peter)Weinberg 和(Brain)Kernighan。

正是这三个人创造了awk---一个优秀的样式扫描与处理工具。

AWK的功能是什么?与sed和grep很相似,awk是一种样式扫描与处理工具。

但其功能却大大强于sed和grep。

awk提供了极其强大的功能:它几乎可以完成grep和sed 所能完成的全部工作,同时,它还可以可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。

它具备了一个完整的语言所应具有的几乎所有精美特性。

实际上,awk的确拥有自己的语言:awk程序设计语言,awk的三位创建者已将它正式定义为:样式扫描和处理语言。

为什么使用awk?即使如此,你也许仍然会问,我为什么要使用awk?使用awk的第一个理由是基于文本的样式扫描和处理是我们经常做的工作,awk所做的工作有些象数据库,但与数据库不同的是,它处理的是文本文件,这些文件没有专门的存储格式,普通的人们就能编辑、阅读、理解和处理它们。

而数据库文件往往具有特殊的存储格式,这使得它们必须用数据库处理程序来处理它们。

既然这种类似于数据库的处理工作我们经常会遇到,我们就应当找到处理它们的简便易行的方法,UNIX有很多这方面的工具,例如sed 、grep、sort以及find等等,awk是其中十分优秀的一种。

使用awk的第二个理由是awk是一个简单的工具,当然这是相对于其强大的功能来说的。

的确,UNIX有许多优秀的工具,例如UNIX天然的开发工具C语言及其延续C++就非常的优秀。

但相对于它们来说,awk完成同样的功能要方便和简捷得多。

AWK,SED,GREP学习笔记及用法心得

AWK,SED,GREP学习笔记及用法心得

GREP,AWK,SED学习笔记及使用心得grepgrep是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

一般格式grep [选项] 基本正则式[文件]选项:-c 不输出内容只统计匹配行数grep -c "123" filename 相当于grep "123" filename | wc -l-i 不区分大小写grep -i "ok" filename 匹配包含ok,Ok,oK,OK的所有行-h 查询多文件时不显示文件名grep -h "123" *.txt 不加-h时会在每一行前显示该行所在文件名-l 查询多文件是只显示包含匹配字符的文件名-n 查询匹配行及行号-v 显示不包含匹配文本的所有行-? 同时显示匹配行上下的?行如:grep -2 "123" filename同时显示匹配行的上下2行。

正则:^ 锚定行的开始如:'^grep'匹配所有以grep开头的行。

$ 锚定行的结束如:'grep$'匹配所有以grep结尾的行。

. 匹配一个非换行符的字符如:'gr.p'匹配gr后接一个任意字符,然后是p。

* 匹配零个或多个先前字符如:'*grep'匹配所有一个或多个空格后紧跟grep的行。

.*一起用代表任意字符。

[] 匹配一个指定范围内的字符如'[Gg]rep'匹配Grep和grep。

[^] 匹配一个不在指定范围内的字符如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。

\(..\)标记匹配字符如'\(love\)',love被标记为1。

\< 锚定单词的开始如:'\<grep'匹配包含以grep开头的单词的行。

linux下awk命令使用详解(实例)

linux下awk命令使用详解(实例)

linux下awk命令使用详解(实例)linux下awk命令使用详解(实例)分类: shell编程开发 2012-04-27 18:15 112人阅读评论(0) 收藏举报最近在搞linux系统脚本文件时,遇到了AWK以前培训的时候没有注意还有这样的命令,这里学习并整理了下!一、awk命令行模式:第一种,命令行方式,如:awk [-Ffield-separator] 'commands' input-file(s)这里commands是真正的awk命令,[-F域分隔符]是可选的,awk 默认使用空格分隔,因此如果要浏览域间有空格的文本,不必指定这个选项,但如果浏览如passwd文件,此文件各域使用冒号作为分隔符,则必须使用-F选项:awk -F : 'commands' input-file第二种,将所有awk命令插入一个文件,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。

第三种,将所有awk命令插入一个单独文件,然后调用:awk -f awk-script-file input-file-f选项指明在文件awk-script-file的awk脚本,input-file是使用awk进行浏览的文件名awk脚本:awk脚本由各种操作和模式组成,根据分隔符(-F选项),默认为空格,读取的内容依次放置到对应的域中,一行一行记录读取,直到文件尾模式和动作:任何awk语句都是由模式和动作组成,在一个awk脚本中可能有许多语句。

模式部分决定动作语句何时触发及触发事件。

动作即对数据进行的操作,如果省去模式部分,动作将时刻保持执行状态模式可以是任何条件语句或复合语句或正则表达式,模式包含两个特殊字段BEGIN和END,使用BEGIN语句设置计数和打印头,BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行;END语句用来在awk 完成文本浏览动作后打印输出文本总数和结尾状态标志,有动作必须使用{}括起来实际动作在大括号{}内指明,常用来做打印动作,但是还有更长的代码如if和循环looping语句及循环退出等,如果不指明采取什么动作,awk默认打印出所有浏览出的记录域和记录:awk执行时,其浏览标记为$1,$2...$n,这种方法称为域标记.使用$1,$3表示参照第1和第3域,注意这里使用逗号分隔域,使用$0表示使用所有域例:awk'{print $0}' temp.txt >sav.txt 表示打印所有域并把结果重定向到sav.txt中awk '{print $0}' temp.txt|tee sav.txt 和上例相似,不同的是将在屏幕上显示出来awk '{print $1,$4}'temp.txt 只打印出第1和第4域awk 'BEGIN {print "NAME GRADE\n-------------"} {print $1"\t"$4}'temp.txt表示打信息头,即输入的内容的第一行前加上"NAMEGRADE\n-------------",同时内容以tab分开awk 'BEGIN {print "being"} {print $1} END {print "end"}' temp 同时打印信息头和信息尾条件操作符:<、<=、==、!=、>=、~匹配正则表达式、!~不匹配正则表达式匹配:awk'{if ($4~/ASIMA/) print $0}' temp 表示如果第四个域包含ASIMA,就打印整条awk '$0 ~ /ASIMA/' temp 表示只要整条包含ASIMA就打印出来精确匹配:awk'$3=="48" {print $0}'temp 只打印第3域等于"48"的记录不匹配:awk '$0 !~ /ASIMA/'temp 打印整条不包含ASIMA的记录不等于:awk '$1 != "asima"' temp小于:awk '{if ($1<$2) print $1 "is smaller"}'temp设置大小写:awk '/[Gg]reen/'temp 打印整条包含Green,或者green的记录任意字符:awk '$1 ~/^...a/'temp 打印第1域中第四个字符是a的记录,^行首,.任意字符或关系匹配:awk '$0~/(abc)|(efg)/' temp 使用|时,语句需要括起来AND与关系:awk '{if ( $1=="a" && $2=="b" )print $0}' tempOR或关系:awk '{if ($1=="a" || $1=="b") print $0}' temp二、awk内置变量:ARGC 命令行参数个数AGRV 命令行参数排列ENVIRON 支持队列中系统环境变量的使用FILENAME awk浏览的文件名FNR 浏览文件的记录数FS 设置输入域分隔符,同- F选项NF 浏览记录的域个数NR 已读的记录数OFS 输出域分隔符ORS 输出记录分隔符RS 控制记录分隔符例:awk 'END {print NR}'temp 在最后打印已读记录条数awk '{print NF,NR,$0} END {print FILENAME}' tempawk '{if (NR>0 &&$4~/Brown/) print $0}' temp 至少存在一条记录且包含BrownNF的另一用法:echo $PWD | awk -F/ '{print$NF}' 显示当前目录名awk操作符:在awk中使用操作符,基本表达式可以划分成数字型、字符串型、变量型、域及数组元素设置输入域到变量名:awk'{name=$1;six=$3; if (six=="man") print name " is " six}'temp域值比较操作:awk 'BEGIN{BASE="27"} {if ($4<BASE) print $0}' temp修改数值域取值:(原输入文件不会被改变)awk '{if ($1=="asima")$6=$6-1;print $1,$6,$7}' temp修改文本域:awk '{if ($1=="asima) ($1=="desc");print $1}' temp只显示修改记录:(只显示所需要的,区别上一条命令,注意{})awk '{if ($1=="asima) {$1=="desc";print$1}}'temp创建新的输出域:awk '{$4=$3-$2; print $4}' temp统计列值:awk '(tot+=$3);END {print tot}'temp 会显示每列的内容awk '{(tot+=$3)};END {printtot}'temp 只显示最后的结果文件长度相加:ls -l|awk '/^[^d]/ {print$9"\t"$5} {tot+=$5} END{print "totKB:" tot}'只列出文件名:ls -l|awk'{print$9}' 常规情况文件名是第9域awk内置字符串函数:gsub(r,s)在整个$0中用s替代rawk'gsub(/name/,"xingming") {print $0}' tempgsub(r,s,t)在整个t中用s替代rindex(s,t)返回s中字符串t的第一位置awk 'BEGIN{print index("Sunny","ny")}'temp 返回4length(s)返回s的长度match(s,r)测试s是否包含匹配r的字符串awk'$1=="J.Lulu" {print match($1,"u")}'temp 返回4split(s,a,fs)在fs上将s分成序列aawk 'BEGIN{print split("12#345#6789",myarray,"#")"'返回3,同时myarray[1]="12", myarray[2]="345",myarray[3]="6789"sprint(fmt,exp)返回经fmt格式化后的expsub(r,s)从$0中最左边最长的子串中用s代替r(只更换第一遇到的匹配字符串)substr(s,p)返回字符串s中从p开始的后缀部分substr(s,p,n)返回字符串s中从p开始长度为n的后缀部分printf函数的使用:字符转换:echo "65" |awk '{printf"%c\n",$0}' 输出Aawk 'BEGIN {printf"%f\n",999}' 输出999.000000格式化输出:awk'{printf "%-15s %s\n",$1,$3}' temp 将第一个域全部左对齐显示其他awk用法:向一行awk命令传值:awk '{if ($5<AGE) print $0}' AGE=10 tempwho | awk '{if ($1==user) print $1 " are in " $2 ' user=$LOGNAME使用环境变量awk脚本命令:开头使用 !/bin/awk -f ,如果没有这句话自含脚本将不能执行,例子:1.!/bin/awk-f2.# allcomment lines must start with a hash '#'3.#name: student_tot.awk4.# tocall: student_tot.awk grade.txt5.#prints total and average of club student points6.7.#print a header first8.BEGIN9.{10.print"Student Date Member No. Grade AgePoints Max"11.print"Name Joined Gained Point Available"12.print"=============================== =================================="13.}14.#let's add the scores of points gained15.(tot+=$6);16.#finished processing now let's print the total and averagepoint17.END18.{19.print "Club student total points :" tot20.print "Average Club Student points :" tot/N21.}[plain] view plaincopyprint?1.awk数组:awk的循环基本结构 For (element in array) print array[element]awk'BEGIN{record="123#456#789";split(record,myarray,"#")} END { for (i in myarray) {print myarray[i]} }[html] view plaincopyprint?1.awk -v MASS_UNPLUG=$MASS_UNPLUG '2.{3.<PRE class=html name="code"><SPAN style="WHITE-SPACE: pre"></SPAN>if ($0 ~ /^\/dev\/sd/) {4.<SPAN style="WHITE-SPACE: pre"></SPAN>print "umount " $2;5.<SPAN style="WHITE-SPACE: pre"></SPAN>if (system("umount " $2)) {6.<SPAN style="WHITE-SPACE: pre"></SPAN>print "umount fail!";7.<SPAN style="WHITE-SPACE: pre"></SPAN>if ($2 ~ /nand/) {8.<SPAN style="WHITE-SPACE: pre"></SPAN>if (plug_devs) {9.<SPAN style="WHITE-SPACE: pre"></SPAN>plug_devs = plug_devs " /dev/ null";10.<SPAN style="WHITE-SPACE: pre"></SPAN>} else {11.<SPAN style="WHITE-SPACE: pre"></SPAN>plug_devs = "/dev/null";12.<SPAN style="WHITE-SPACE: pre"></SPAN>}13.<SPAN style="WHITE-SPACE: pre"></SPAN>}14.<SPAN style="WHITE-SPACE: pre"></SPAN>}15.<SPAN style="WHITE-SPACE: pre"></SPAN>}</PRE>}END {system("echo \"/usr/mas s /dev/null&\" >> " MASS_UNPLUG);print "/usr/mass " plug_de vs " &";system("/usr/mass " plug_devs " &");} ' /proc/mounts<P ></P>16.<PRE></PRE>17.<BR>18.上面是我遇到的一个AWK的样例:19.<P></P>20.<P>功能就是:查找/proc/mount 文件中记录的一些挂载节点数据!</P>21.<P><BR>22.</P>23.<P></P>24.<BR>。

【awk】awk语法(小结)

【awk】awk语法(小结)

【awk】awk语法(小结)【awk】awk语法(小结)Shell编程 2010-05-25 11:04:45 阅读644 评论0 字号:大中小导读:bkeep第一篇:基础篇1,awk基本语法2,比较操作符3,复合表达式4,next命令:5,awk中的数字操作符:6,awk中的赋值操作符7,BEGIN 和 END8,内置变量9,awk使用shell变量10,awk中的三种流控制语句10.1 if语句10.2 while语句:10.3 for语句:11. $0:12,shell里的特殊变量第二篇:准高级篇1,内置函数2,输入输出的内部函数3,借用C语言的格式化输出指令,4,printf “%。

”中的。

有以下格式5,gawk中的特殊字符:6,改变字段分隔符7,元字符8,调用gawk程序9,数组10,用户自定义函数正文:第一篇:基础篇1,awk基本语法awk ‘script’ filesscript 由下面的结构组成 /pattern/{actions}2,比较操作符语法:expression {actions;}expression 可以使用以下操作符构成< 小于> 大于<= 小于等于>= 大于等于== 等于!= 不等于value ~ /pattern/ 若value匹配pattern则为真value !~ /pattern/ 若value不匹配pattern则为真说明:$2 ~ /^\$[1-9][0-9]* 将匹配第二列以$开头,然后大于1的二位数。

(注意,这里是1而不是10)3,复合表达式语法:(compound expression)(expr1)&& (expr2) ------- 与(expr1)|| (expr2) ------- 或说明一下:符合表达式必须用括号括起来当使用&&时,expr1和expr2必须同时为零(零代表真!呵呵~),复合表达式才为真;当使用 || 时,expr1和expr2 只要有一个为真,复合表达式则为真!4,next命令:告诉awk跳过剩下的所有模式和表达式,并读取输入的下一行,同时从第一个模式或表达式开始处理该行!5,awk中的数字操作符:+ 加- 减* 乘/ 除% 求余^ 求幂6,awk中的赋值操作符+= x+=1 就是x=x+1-= x-=1 就是x=x-1*= x*=1 就是x=x*1/= x/=1 就是x=x/1%= x%=2 就是x=x%2^= x^=2 就是x=x^27,BEGIN 和 ENDawk的语法:/pattern/ {action} pattern:模式这里pattern有两个特殊模式BEGIN和END下面是BEGIN END的语法:awk ‘BEGIN { actions }/ pattern / { actions }/ pattern / { actions }END { actions }‘ filesBEGIN和END都是可选的·当指定BEGIN模式时,awk在读取任何输入前执行动作 actions ·当指定END模式时,awk在其退出前执行动作actions这里要特别注意:比如awk读入aa.txt。

Linux命令高级技巧使用awk进行大型文件的数据处理和分析

Linux命令高级技巧使用awk进行大型文件的数据处理和分析

Linux命令高级技巧使用awk进行大型文件的数据处理和分析Linux命令高级技巧:使用AWK进行大型文件的数据处理和分析AWK是一种用于处理和分析文本文件的强大工具,特别适用于处理大型文件。

它提供了丰富的功能和灵活的语法,可以轻松解决各种数据处理和分析的需求。

本文将介绍AWK的基本使用方法,并重点讨论如何利用AWK来处理和分析大型文件。

一、AWK的基本用法AWK是一种类似于编程语言的工具,它以文本文件为输入,逐行处理其中的数据,并提供丰富的操作符和函数来实现各种操作。

以下是AWK的基本用法:1. 打印行:使用AWK可以轻松打印文本文件中的行。

下面的命令将逐行打印文件file.txt的内容:```shellawk '{print}' file.txt```2. 打印特定列:AWK可以使用字段分隔符来访问文本文件中的特定列。

下面的命令将打印文件file.txt中的第一列和第三列:```shellawk '{print $1, $3}' file.txt```3. 条件过滤:AWK可以使用条件过滤来选取满足特定条件的行。

下面的命令将打印文件file.txt中第二列大于10的行:```shellawk '$2 > 10 {print}' file.txt```二、AWK的高级技巧除了基本用法外,AWK还提供了一些高级技巧,可以更加灵活和高效地处理大型文件。

1. 自定义字段分隔符:默认情况下,AWK使用空格作为字段分隔符。

但是,在实际应用中,文本文件的字段分隔符可能是其他字符。

可以通过设置`-F`参数来指定字段分隔符。

下面的命令将使用逗号作为字段分隔符:```shellawk -F, '{print $1, $3}' file.txt```2. 计算行数和列数:AWK提供了内置变量`NR`和`NF`,分别表示当前行号和当前行的字段数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Awk学习笔记整理:Jims of 肥肥世家<jims.yang@>Copyright © 2004 本文遵从GPL协议,欢迎转载、修改、散布。

第一次发布时间:2004年8月6日Table of Contents1. awk简介2. awk命令格式和选项2.1. awk的语法有两种形式2.2. 命令选项3. 模式和操作3.1. 模式3.2. 操作4. awk的环境变量5. awk运算符6. 记录和域6.1. 记录6.2. 域6.3. 域分隔符7. gawk专用正则表达式元字符8. POSIX字符集9. 匹配操作符(~)10. 比较表达式11. 范围模板12. 一个验证passwd文件有效性的例子13. 几个实例14. awk编程14.1. 变量14.2. BEGIN模块14.3. END模块14.4. 重定向和管道14.5. 条件语句14.6. 循环14.7. 数组14.8. awk的内建函数15. How-to1. awk简介awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。

数据可以来自标准输入、一个或多个文件,或其它命令的输出。

它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。

它在命令行中使用,但更多是作为脚本来使用。

awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。

如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。

awk分别代表其作者姓氏的第一个字母。

因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。

gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。

下面介绍的awk是以GUN的gawk为例的,在linux系统中已把awk链接到gawk,所以下面全部以awk进行介绍。

2. awk命令格式和选项2.1. awk的语法有两种形式∙awk [options] 'script' var=value file(s)∙awk [options] -f scriptfile var=value file(s)2.2. 命令选项-F fs or --field-separator fs指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。

-v var=value or --asign var=value赋值一个用户定义变量。

-f scripfile or --file scriptfile从脚本文件中读取awk命令。

-mf nnn and -mr nnn对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。

这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

-W compact or --compat, -W traditional or --traditional在兼容模式下运行awk。

所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。

-W copyleft or --copyleft, -W copyright or --copyright打印简短的版权信息。

-W help or --help, -W usage or --usage打印全部awk选项和每个选项的简短说明。

-W lint or --lint打印不能向传统unix平台移植的结构的警告。

-W lint-old or --lint-old打印关于不能向传统unix平台移植的结构的警告。

-W posix打开兼容模式。

但有以下限制,不识别:\x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。

-W re-interval or --re-inerval允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。

-W source program-text or --source program-text使用program-text作为源代码,可与-f命令混用。

-W version or --version打印bug报告信息的版本。

3. 模式和操作awk脚本是由模式和操作组成的:pattern {action} 如$ awk '/root/' test,或$ awk '$3 < 100' test。

两者是可选的,如果没有模式,则action应用到全部记录,如果没有action,则输出匹配全部记录。

默认情况下,每一个输入行都是一条记录,但用户可通过RS变量指定不同的分隔符进行分隔。

3.1. 模式模式可以是以下任意一个:∙/正则表达式/:使用通配符的扩展集。

∙关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串或数字的比较,如$2>%1选择第二个字段比第一个字段长的行。

∙模式匹配表达式:用运算符~(匹配)和~!(不匹配)。

∙模式,模式:指定一个行的范围。

该语法不能包括BEGIN和END模式。

∙BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。

∙END:让用户在最后一条输入记录被读取之后发生的动作。

3.2. 操作操作由一人或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内。

主要有四部份:∙变量或数组赋值∙输出命令∙内置函数∙控制流命令4. awk的环境变量Table 1. awk的环境变量5. awk运算符Table 2. 运算符6. 记录和域6.1. 记录awk把每一个以换行符结束的行称为一个记录。

记录分隔符:默认的输入和输出的分隔符都是回车,保存在内建变量ORS和RS 中。

$0变量:它指的是整条记录。

如$ awk '{print $0}' test将输出test文件中的所有记录。

变量NR:一个计数器,每处理完一条记录,NR的值就增加1。

如$ awk '{print NR,$0}' test将输出test文件中所有记录,并在记录前显示记录号。

6.2. 域记录中每个单词称做“域”,默认情况下以空格或tab分隔。

awk可跟踪域的个数,并在内建变量NF中保存该值。

如$ awk '{print $1,$3}' test将打印test 文件中第一和第三个以空格分开的列(域)。

6.3. 域分隔符内建变量FS保存输入域分隔符的值,默认是空格或tab。

我们可以通过-F命令行选项修改FS的值。

如$ awk -F: '{print $1,$5}' test将打印以冒号为分隔符的第一,第五列的内容。

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

输出域的分隔符默认是一个空格,保存在OFS中。

如$ awk -F: '{print $1,$5}' test,$1和$5间的逗号就是OFS的值。

7. gawk专用正则表达式元字符一般通用的元字符集就不讲了,可参考我的Sed和Grep学习笔记。

以下几个是gawk专用的,不适合unix版本的awk。

\Y匹配一个单词开头或者末尾的空字符串。

\B匹配单词内的空字符串。

\<匹配一个单词的开头的空字符串,锚定开始。

\>匹配一个单词的末尾的空字符串,锚定末尾。

\w匹配一个字母数字组成的单词。

\W匹配一个非字母数字组成的单词。

\‘匹配字符串开头的一个空字符串。

\'匹配字符串末尾的一个空字符串。

8. POSIX字符集可参考我的Grep学习笔记9. 匹配操作符(~)用来在记录或者域内匹配正则表达式。

如$ awk '$1 ~/^root/' test将显示test 文件第一列中以root开头的行。

10. 比较表达式conditional expression1 ? expression2: expression3,例如:$ awk '{max = {$1 > $3} ? $1: $3: print max}' test。

如果第一个域大于第三个域,$1就赋值给max,否则$3就赋值给max。

$ awk '$1 + $2 < 100' test。

如果第一和第二个域相加大于100,则打印这些行。

$ awk '$1 > 5 && $2 < 10' test,如果第一个域大于5,并且第二个域小于10,则打印这些行。

11. 范围模板范围模板匹配从第一个模板的第一次出现到第二个模板的第一次出现之间所有行。

如果有一个模板没出现,则匹配到开头或末尾。

如$ awk '/root/,/mysql/' test将显示root第一次出现到mysql第一次出现之间的所有行。

12. 一个验证passwd文件有效性的例子$ cat /etc/passwd | awk -F: '\NF != 7{\printf("line %d,does not have 7 fields:%s\n",NR,$0)}\$1 !~ /[A-Za-z0-9]/{printf("line %d,non alpha and numeric user id:%d: %s\n,NR,$0)}\$2 == "*" {printf("line %d, no password: %s\n",NR,$0)}'cat把结果输出给awk,awk把域之间的分隔符设为冒号。

如果域的数量(NF)不等于7,就执行下面的程序。

printf打印字符串"line ?? does not have 7 fields",并显示该条记录。

如果第一个域没有包含任何字母和数字,printf打印“no alpha andnumeric user id" ,并显示记录数和记录。

如果第二个域是一个星号,就打印字符串“no passwd”,紧跟着显示记录数和记录本身。

13. 几个实例∙$ awk '{print $3}' test-----截取第三域(列)的内容。

相关文档
最新文档