AWK:Linux 管理员的智能工具包摘要
- 格式:pdf
- 大小:171.17 KB
- 文档页数:16
linux脚本Shell之awk详解⼀.基本介绍1.awk:awk是⼀个强⼤的⽂本分析⼯具,在对⽂本⽂件的处理以及⽣成报表,awk是⽆可替代的。
awk认为⽂本⽂件都是结构化的,它将每⼀个输⼊⾏定义为⼀个记录,⾏中的每个字符串定义为⼀个域(段),域和域之间使⽤分割符分割。
2.功能:流控制、数学运算、进程控制、内置的变量和函数、循环和判断3.⼯作原理:awk 会把每⾏进⾏⼀个拆分,⽤相应的命令对拆分出来的“段”进⾏处理。
(1)⾏⼯作模式,读⼊⽂件的每⼀⾏,会把⼀⾏的内容,存到$0⾥(2)使⽤内置的变量FS(段的分隔符,默认⽤的是空⽩字符),分割这⼀⾏,把分割出来的每个段存到相应的变量$(1-100)(3)输出的时候按照内置变量OFS(out FS),输出(4)读⼊下⼀⾏继续操作简单实例1 [root@tx3 ~]# echo "this is a book" > awk.txt2 [root@tx3 ~]# awk '{print $2,$1,$3,$4}' awk.txtis this a book4. Awk常⽤内置变量表:1 $0 当前记录(作为单个变量)2 $1~$n 当前记录的第n个字段,字段间由FS分隔3 FS 输⼊字段分隔符默认是空格(可记忆为:FieldsSpace缩写)4 NF 当前记录中的字段个数,就是有多少列(可记忆为:NumberFields缩写)5 NR 已经读出的记录数,就是⾏号,从1开始(可记忆为:NumberRows缩写)6 RS 输⼊的记录他隔符默认为换⾏符(可记忆为:RowsSpace缩写)7 OFS 输出字段分隔符默认也是空格(可记忆为:OutputFieldsSpace缩写)8 ORS 输出的记录分隔符,默认为换⾏符(可记忆为:OutputRowsSpace缩写)9 ARGC 命令⾏参数个数10 ARGV 命令⾏参数数组11 FILENAME 当前输⼊⽂件的名字12 IGNORECASE 如果为真,则进⾏忽略⼤⼩写的匹配13 ARGIND 当前被处理⽂件的ARGV标志符14 CONVFMT 数字转换格式 %.6g15 ENVIRON UNIX环境变量16 ERRNO UNIX系统错误消息17 FIELDWIDTHS 输⼊字段宽度的空⽩分隔字符串18 FNR 当前记录数19 OFMT 数字的输出格式 %.6g20 RSTART 被匹配函数匹配的字符串⾸21 RLENGTH 被匹配函数匹配的字符串长度⼆.print的简单使⽤例:打印整⾏: $01 [root@tx3 ~]# cp /etc/passwd p12 [root@tx3 ~]# awk '{print $0}' p1例:打印每⾏的最后⼀个字段: $NF1 [root@tx3 ~]# awk -F : '{print $NF}' p1例:打印第三个字段: $3[root@tx3 ~]# awk -F : '{print $3}' p1例:打印第⼀⾏NR==11 [root@tx3 ~]# awk 'NR==1{print $0}' p1root:x:0:0:root:/root:/bin/bash例:打印最后⼀⾏1 [root@tx3 ~]# awk 'END{print $0}' p1tx:x:500:500:tx:/home/tx:/bin/bash例:打印第⼀⾏最后⼀个字段1 [root@tx3 ~]# awk -F: 'NR==1{print $NF}' p1/bin/bash例:打印最后⼀⾏最后⼀个字段1 [root@tx3 ~]#awk -F: 'END{print $NF}' p1例:打印每⾏的倒数第⼆个字段,并在其后打印你好1 [root@tx3 ~]# awk -F: '{print $(NF-1),"nihao"}' p1/root nihao/bin nihao/sbin nihao例:打印⾏号1 [root@tx3 ~]# awk '{print NR,$0}' p11 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin例:打印当前系统环境变量的某个特定值1 [root@tx3 ~]# awk 'BEGIN{print ENVIRON["PATH"];}'/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin例:⽤:分割,删除第2个字段1 [root@tx3 ~]# awk 'BEGIN{FS=":";OFS=":"}{print $1,$3,$4,$5,$6,$7}' p1root:0:0:root:/root:/bin/bashbin:1:1:bin:/bin:/sbin/nologindaemon:2:2:daemon:/sbin:/sbin/nologinBEGIN和END:(打印报表实例)在Unix awk中两个特别的表达式,BEGIN和END,这两者都可⽤于pattern中(参考前⾯的awk语法),提供BEGIN和END的作⽤是给程序赋予初始状态和在程序结束之后执⾏⼀些扫尾的⼯作。
linux常用命令awk的用法Linux令awk是一种强大、自动化的文本处理程序,可以用来查找和处理文本或数据文件中的信息,也可以用来进行数据分析和操作。
由Bell Laboratories开发的awk命令,是UNIX工作站系统的一部分,现在也可以安装在Linux系统中。
awk命令使用文本处理程序中最简单、最有效的命令行工具之一,通常用来分析或读取文本文件中的数据,并以易于理解的格式显示结果。
awk命令可以用来处理文本文件行中的单词、文本字段、格式化文件文本及以逗号隔开的数据文件等。
awk命令是以行为基本单位的工具,也就是说,awk指令是以一行行的形式读取文本。
它也可以处理特殊的字符,例如回车、逗号、双引号等,这使得它能够将文本分割成字段,而不仅仅是行的简单读取。
awk命令的语法如下:awk [options] script var=value file(s)options和var=value是可选参数,它们和后面的文件名称之间由空格分隔。
options指定特定的awk特性或设置,var=value定义了awk变量,script是指定awk执行的动作,由一系列的操作命令组成,最后是文件列表,可以是单个文件名,也可以是多个文件名,用空格分隔。
使用awk命令时,必须指定一组指令,然后使用括号把它们括起来,如下所示:{ action 1 action 2 action 3 }介绍了awk命令的语法之后,就可以开始介绍awk的用法,它有许多应用场景,例如:(1)查找指定文件中的关键字:可以使用awk快速查找指定文件中的关键字。
(2)替换文本文件中的字母、数字等:可以使用awk替换文本文件中的字母、数字等。
(3)格式化字段:使用awk命令可以轻松地格式化文本文件的字段。
(4)处理以数据作为参数的指令:awk可以读取以数据作为参数的指令,并对它们进行处理,例如统计求和等。
(5)筛选行:awk命令可以根据文本文件中的一行的信息,自动筛选出符合条件的行,从而使得查询更加精准。
Linux命令之awkgawk(⽂本报告⽣成器) awk是gawk的链接⽂件,是⼀种优良的⽂本处理⼯具,实现格式化⽂本输出,是Linux和Unix现有环境中功能最强⼤的数据处理引擎之⼀。
这种编程及数据操作语⾔的最⼤功能取决于⼀个⼈拥有的知识量,使⽤"man gawk"给出的简述为“模式扫描和处理语⾔”。
任何awk语句都是由模式和动作组成,⼀个awk脚本可以有多个语句,模式决定动作语句的触发条件和触发时间。
模式包含:正则表达式,/[正则表达式]/;关系运算符,<、<=、>、>=、!=、==;正则运算符,~(匹配)、!~(不匹配);赋值运算符,=、+=、-=、*=、/=、%=、**=;逻辑运算符||、&&;算术运算符+、-、*、/、++、--;其他运算符,$(⽤来对字段进⾏引⽤),空格(字符串连接符)。
动作包含:变量、命令、内置函数、流程控制语句。
语法:awk [选项] 'BEGIN{开始语句}模式{动作} END{结束语句}' [⽂件]。
其中BEGIN和END是awk的关键字,必须⼤写。
不过开始模块和结束模块是可选部分,可以省略。
并且开始语句和结束语句也是动作语句。
另外,⼯作模块中的模式和动作可以都存在,也可以⼆者选其⼀。
如果省略模式,那么⽂件的所有⾏都执⾏动作;如果省略动作,表⽰对符合条件的⾏执⾏默认的print动作。
正因为可以⼆者选其⼀,所以⼀般⽤{}包裹动作,⽤于区分模式和动作。
(1).特殊模块BEGIN和END 在awk中BEGIN和END都只能执⾏⼀次。
BEGIN语句在动作语句之前执⾏,⼀般⽤于设置变量计数的起始值,打印头部信息和改变字段的分隔符。
END语句在完成动作语句之后执⾏,⼀般⽤于输出统计结果,打印结尾信息。
(2).执⾏过程 awk的执⾏过程(⼯作步骤)可以简单分为⼀下⼏步:第⼀步,执⾏BRGIN模块;第⼆步,从⽂件、管道或标准输⼊中读取⼀⾏保存到内存中;第三步,对读取的⾏数据执⾏⼯作模块;第四步,判断是否到达⽂件、管道或标准输⼊的结尾,如果未到达结尾则重复第⼆步和第三步;第五步,到达⽂件、管道或标准输⼊的结尾后,执⾏END模块。
Linux命令高级技巧利用awk命令进行数据处理与分析的高级应用Linux命令高级技巧:利用awk命令进行数据处理与分析的高级应用在Linux操作系统中,awk是一种强大的命令行工具,用于对文本文件进行数据处理和分析。
它能够根据特定的模式和动作对数据进行提取、转换和统计,使得数据处理变得更加高效和灵活。
本文将介绍awk命令的高级技巧,帮助您更好地利用awk进行数据处理与分析。
一、安装awk命令在大多数Linux发行版中,awk命令已经预装在系统中,您无需进行额外安装。
若您的系统中尚未安装awk命令,可通过包管理工具进行安装,例如在Ubuntu系统中,可以通过以下命令进行安装:```shellsudo apt-get install gawk```二、基本语法和用法awk命令的基本语法格式如下:```shellawk 'pattern {action}' file```其中,pattern为用于匹配数据的模式,action为匹配成功后要执行的动作,file为待处理的文件。
下面是一个简单的示例:```shellawk '{print $1}' file.txt```上述命令将打印出file.txt文件中每行的第一个字段。
三、高级应用之数据提取awk命令在数据提取方面有着出色的表现。
它可以根据不同的模式匹配条件提取满足条件的数据,并进行进一步处理。
以下是一些常用的数据提取技巧:1. 提取特定字段awk命令可以通过指定字段的位置或使用正则表达式进行字段匹配,从而提取特定字段的数据。
例如,要提取文件中的第二个字段,可以使用以下命令:```shellawk '{print $2}' file.txt```2. 根据行号提取数据除了根据字段提取数据,awk命令还可以根据行号进行数据提取。
例如,要提取文件中的第10行数据,可以使用以下命令:```shellawk 'NR==10' file.txt```3. 根据模式提取数据awk命令支持使用模式匹配提取相应数据。
Linux命令高级技巧使用awk和正则表达式进行高级数据分析和处理在Linux操作系统中,awk和正则表达式是进行高级数据分析和处理的强大工具。
它们可以帮助我们从复杂的数据集中提取、转换和处理数据,大大提高工作效率。
本文将介绍如何使用awk和正则表达式进行高级数据分析和处理的技巧。
一、awk命令简介awk是一种用于处理文本文件的命令行工具,也是Linux系统中的一种编程语言。
它以行为单位,逐行读取输入文件,并根据用户指定的规则进行处理。
awk的核心是模式-动作对,即根据某个模式匹配到的行执行相应的动作。
它具有强大的文本处理能力,支持自定义变量和函数,灵活性和扩展性非常高。
二、正则表达式介绍正则表达式是一种用于描述文本模式的方法,它可以帮助我们在文本中进行复杂的匹配和搜索操作。
在awk命令中,正则表达式常用于模式匹配和数据提取。
正则表达式的基本语法包括:字符、元字符、字符类、量词、位置限定符等。
在awk命令中,可以使用正则表达式对文本进行模式匹配,从而提取出符合要求的数据。
三、使用awk和正则表达式进行数据分析1. 提取指定字段awk命令可以通过指定字段分隔符,提取出文本中的指定字段。
例如,假设我们有一个以逗号分隔的数据文件data.csv,每行包含姓名、年龄、性别等字段,我们可以使用以下命令提取出所有行的姓名字段:```awk -F ',' '{print $1}' data.csv```上述命令中的-F参数指定字段分隔符为逗号,$1表示第一个字段。
2. 基于正则表达式进行模式匹配awk命令可以使用正则表达式对文本进行模式匹配。
例如,我们可以使用以下命令提取出包含特定关键词的行:```awk '/keyword/ {print}' data.txt```上述命令中的/keyword/表示匹配包含关键词"keyword"的行。
3. 使用正则表达式进行模式替换awk命令除了可以进行数据提取外,还可以使用正则表达式进行模式替换。
linux awk命令使用实例-回复Linux awk命令使用实例在Linux系统中,awk是一种强大的文本处理工具,可以用于匹配、分析、格式化和处理文本文件。
它是Linux命令行中非常常用的工具之一。
本文将详细介绍awk命令的使用实例,希望能帮助读者更好地掌握这个强大工具。
1. awk命令概述awk命令是一种文本处理工具,它可以根据指定的规则对输入的文本进行匹配、分析和处理。
awk命令是以行为单位进行操作的,它会依次遍历每一行,并根据指定的条件对每一行进行相应的操作。
awk命令的一般语法如下:awk '条件1{动作1} 条件2{动作2} ...' 文件名2. 使用awk进行文本过滤首先,我们以一个简单的例子来演示awk命令的使用。
假设我们有一个名为"test.txt"的文本文件,内容如下:apple 2banana 3orange 4现在,我们想要过滤出数量大于等于3的水果。
我们可以使用awk命令来实现这个功能:awk '2 >= 3' test.txt运行以上命令后,输出结果为:banana 3orange 4上述命令中,"2"表示第二个字段,即水果的数量。
">= 3"表示数量大于等于3的条件。
所以,这个命令的含义就是筛选出数量大于等于3的行,并输出相应的结果。
3. 使用awk进行文本替换除了过滤,awk命令还可以用来进行文本替换。
假设我们要将上述例子中的"apple"替换成"pear",我们可以使用以下命令:awk '{sub("apple", "pear"); print}' test.txt运行以上命令后,输出结果为:pear 2banana 3orange 4上述命令中的"sub("apple", "pear")"表示将每一行中的"apple"替换成"pear"。
Linux命令高级技巧使用awk命令进行文本处理和数据提取Linux命令高级技巧:使用awk命令进行文本处理和数据提取在Linux系统中,awk是一种强大的文本处理工具,它可以用于处理数据文件、生成报表以及提取文本中的特定信息。
awk命令的灵活和高效使得它成为Linux用户必备的工具之一。
本文将介绍awk命令的基本用法和高级技巧,帮助读者更好地利用awk进行文本处理和数据提取。
1. awk命令基本语法和工作原理awk命令的基本语法为:```awk 'pattern { action }' filename```其中,pattern是用于匹配文本的模式,action是在匹配成功后执行的操作。
awk处理文本的方式是逐行读取文件,按照指定的模式进行匹配,并执行相应的操作。
操作可以是打印、计算、替换等。
下面是一个简单的示例:```awk '/keyword/ { print $1 }' filename```该命令表示在filename文件中匹配包含关键字"keyword"的行,并打印每行的第一个字段。
2. 使用awk命令进行文本处理awk命令在文本处理方面有着广泛的应用。
它可以对文本进行排序、过滤、计算和格式化等操作。
下面介绍几个常用的awk命令技巧。
2.1 文本过滤和匹配通过awk命令可以方便地对文本进行过滤和匹配。
例如,要过滤出包含特定关键字的行,可以使用如下命令:```awk '/keyword/' filename```该命令将输出filename文件中所有包含关键字"keyword"的行。
2.2 提取字段awk命令可以提取文本中的指定字段。
字段之间以空格或制表符分隔,默认情况下,awk将每行数据的第一个字段标记为$1,第二个字段标记为$2,依此类推。
例如,要提取文件中的第二个字段,可以使用如下命令:```awk '{ print $2 }' filename```该命令将输出filename文件中每一行的第二个字段。
选项含义-F fs 指定以 fs 作为输⼊⾏的分隔符,awk 命令默认分隔符为空格或制表符-f file从脚本⽂件中读取 awk 脚本指令,以取代直接在命令⾏中输⼊指令-v var=val 在执⾏处理过程之前,设置⼀个变量 var ,并设置初始值为 val Linuxawk 命令详解⼀、awk 命令介绍 除了使⽤ sed 命令,Linux 系统中还有⼀个功能更加强⼤的⽂本数据处理⼯具,就是 awk 。
它诞⽣于 20 世纪 70 年代末期,这也许是它影响了众多 Linux ⽤户的原因之⼀。
曾有⼈推测 awk 命令的名字来源于 awkward 这个单词。
其实不然,此命令的设计者有 3 位,他们的姓分别是 Aho 、Weingberger 和 Kernighan ,awk 就取⾃这 3 为⼤师姓的⾸字母。
awk 的最基本功能是在⽂件或字符串中基于指定规则浏览和抽取信息,awk 抽取信息后,才能进⾏其他⽂本操作,完整的awk 脚本通常⽤来格式化⽂本⽂件中的信息。
awk 和 sed 命令类似,awk 命令也是逐⾏扫描⽂件(从第 1 ⾏到最后⼀⾏),寻找含有⽬标⽂本的⾏,如果匹配成功,则会在该⾏上执⾏⽤户想要的操作;反之,则不对⾏做任何处理。
awk 命令的基本格式为:[root@localhost ~]# awk [选项] '脚本命令' ⽂件名 此命令常⽤的选项以及各⾃的含义,如下表所⽰: awk 的强⼤之处在于脚本命令,它由 2 部分组成,分别为匹配规则和执⾏命令,如下所⽰:'匹配规则{执⾏命令}' 这⾥的匹配规则,和 sed 命令中的 address 部分作⽤相同,⽤来指定脚本命令可以作⽤到⽂本内容中的具体⾏,可以使⽤字符串(⽐如 /demo/,表⽰查看含有 demo 字符串的⾏)或者正则表达式指定。
另外需要注意的是,整个脚本命令是⽤单引号('')括起,⽽其中的执⾏命令部分需要⽤⼤括号({})括起来。
Linux命令高级技巧使用awk进行字段操作与切割Linux命令高级技巧:使用awk进行字段操作与切割在Linux系统中,执行命令是我们日常工作的一部分。
而对于大量数据的处理和操作,awk是一款非常实用的工具。
它可以用于文本处理和数据分析,提供了丰富的功能和灵活的操作方式。
本文将介绍如何使用awk进行字段操作与切割,帮助读者更加高效地处理数据。
1. 什么是awk?awk是一种文本处理器,其名称来源于它的三位创始人——Aho、Weinberger和Kernighan。
awk工具以行为单位处理文件,根据指定的规则匹配行并执行相应的动作。
它的主要功能包括:处理字段、格式化输出、条件判断、循环控制等。
2. 基本语法awk的基本语法结构为:'pattern { action }'。
其中,pattern是用来匹配行的规则,action是在匹配到的行上执行的操作。
例如,要打印出文件中所有行的内容,可以使用以下命令:```shellawk '{ print $0 }' filename```其中,$0代表整行内容,在这个例子中我们直接将每行内容原样打印出来。
3. 字段操作awk是以字段为单位进行处理的,可以通过字段号或者字段的名称进行操作。
默认情况下,字段是以空格作为分隔符的,可以使用-F选项自定义分隔符。
以下是一些常用的字段操作示例:- 打印指定字段使用$1、$2等表示第1、2个字段。
例如,要打印文件中每行的第2个字段,可以使用以下命令:```shellawk '{ print $2 }' filename```- 修改指定字段的值可以通过直接对字段进行赋值来修改其值。
例如,将文件中第3个字段的值修改为"new_value",可以使用以下命令:```shellawk '{ $3="new_value"; print $0 }' filename```- 添加新字段可以通过追加新的字段来修改行的内容。
AWK:Linux 管理员的智能工具包摘要AWK 实用工具带有其自己的自包含语言,它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。
这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识。
它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报 表,还有无数其他的功能。
(2004-07-19 21:39:24)By lanf, 出处:/global/cn/pub/articles/dulaney_awk.html作者 Emmett Dulaney您正在学习 Linux 吗?本文对于非常有用的 AWK 文本操作工具进行了介绍,非常有价值。
AWK 实用工具带有其自己的自包含语言,它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。
这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识。
它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报 表,还有无数其他的功能。
AWK 是什么?最简单地说,AWK 是一种用于处理文本的编程语言工具。
AWK 实用工具的语言在很多方面类似于 shell 编程语言,尽管 AWK 具有完全属于其本身的语法。
在最初创造 AWK 时,其目的是用于文本处理,并且这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令。
该实用工具扫描文件中的每一行,查找与命令行中所给定 内容相匹配的模式。
如果发现匹配内容,则进行下一个编程步骤。
如果找不到匹配内容,则继续处理下一行。
尽管操作可能会很复杂,但命令的语法始终是:一系列命令。
花括号 ({}) 不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。
了解字段实用工具将每个输入行分为记录和字段。
记录是单行的输入,而每条记录包含若干字段。
默认的字段分隔符是空格或制表符,而记录的分隔符是换行。
虽然在默认情况下将制表符和空格都看作字段分隔符(多个空格仍然作为一个分隔符),但是可以将分隔符从空格改为任何其它字符。
为了进行演示,请查看以下保存为 emp_names 的员工列表文件:配给变量 $1、$2、$3等等。
一行在本质上可以包含无数个字段,通过字段号来访问每个字段。
因此,命令在每个字段间只有一个空格。
利用为每个字段指定了唯一号码的功能,您可以选择只打印特定的字段。
例如,只打印每条记录的姓名时,只需选择第二个和第三个字段进行打印:姓名字段,并且使其顺序颠倒,先显示名字再显示姓氏:通过包含一个必须匹配的模式,您可以选择只对特定的记录而不是所有的记录进行操作。
模式匹配的最简单形式是搜索,其中要匹配的项目被包含在斜线(/pattern/) 中。
例如,只对那些居住在阿拉巴马州的员工执行前面的操作:打印城市和州名:如果分别给出两个打印语句,则会产生完全不同的结果:终打印它们。
只有第一组花括号中的命令对前面紧邻的命令 (/AL/) 起作用。
结果非常不便于阅读,可以使其稍微更清晰一些。
首先,在城市与州之间插入一个空格和逗号。
然后,在每两行显示之后放置一个空行:打印一个换行符 (\n)。
在 AWK 打印语句中还可以使用那些可在 echo命令中使用的所有特殊字符,包括:•\n(换行)•\t(制表)•\b(退格)•\f(进纸)•\r(回车)因此,要读取全部五个最初由制表符分隔开的字段,并且也利用制表符打印它们,您可以编程如下州的人时,出现了一个问题:记,当在 AWK 中进行模式匹配时,例如 grep、sed或者大部分其他 Linux/Unix 命令,将在记录(行)中的任何位置查找匹配,除非指定进行其他操作。
为解决这一问题,必须将搜索与特定字段联系起来。
通过利用代字号 (?) 以及对特定字段的说明,可以达到这一目的,如下例所示:如果搜索序列没有出现在指定字段中,则找出与搜索序列相匹配的所有行:条目确实包含 AR,但却是在第三个字段而不是第五个字段中。
花括号和字段分隔符括号字符在 AWK 命令中起着很重要的作用。
出现在括号之间的操作指出将要发生什么以及何时发生。
当只使用一对括号时:如果有第三组命令,则在第二组命令完成后执行它,以此 类推。
在所生成的打印输出中,有两个分隔的打印命令,因此先执行第一个命令,随后执行第二个命令,这样导致每个条目显示在两行而不是一行中。
区分两个字段的字段分隔符不一定始终是空格;它可以是任何可识别的字符。
为进行演示,假定 emp_names文件利用冒号而不是制表符来分隔字段:为解决这一问题,必须通知 AWK 是空格之外的另一个字符作为分隔符,有两种方法可通知AWK 使用新的字段分隔符:使用命令行参数 -F,或在程序中指定变量 FS。
两种方法的效果相同,只有一种例外情况,如下例所示:才识别字段分隔符并正确地执行。
通过使用 BEGIN语句可以纠正这一缺点(在后文详述)。
-F的功能非常类似于 BEGIN,能够正确地读取第一条记录并按要求执行。
在本文开始处我曾提到,默认的显示/输出字段分隔符是空格。
通过使用输出字段分隔符(OFS) 变量,可以在程序中更改此特性。
例如,要读取文件(由冒号分隔)并以短划线显示,则命令是具中使用的变量。
例如,要在打印时为每行编号,可以采用以下方式使用 NR变量:可以按照添加控制序列或其他字符的相同方式将文本添加到显示中。
例如,要将分隔符从空格改为冒号,则命令是值可以是任何内容。
例如,创建一个关于居住在阿拉巴马州的员工的外观类似数据库的显示:AWK 除了提供文本功能,还提供全部范围的算术操作符,包括以下符号: + 将数字相加- 减* 乘/ 除^ 执行指数运算% 提供模++ 将变量值加一+= 将其他操作的结果分配给变量— 将变量减一-= 将减法操作的结果分配给变量*= 分配乘法操作的结果/= 分配除法操作的结果%= 分配求模操作的结果例如,假定您的机器上存在以下的文件,详细地列出硬件商店中的物品:物品的库存价值:按照每条记录中的物品数量增加:第二个字段的值。
第二次执行时,它保留了第一行的值并加上第二行的值,以此类推,直到达到累计的总合。
可以应用相同的过程来确定现有库存的总价值:需要加工成实际的报表。
利用一些附加项,很容易使显示变得更整洁:BEGIN和 END使用 BEGIN和 END语句可以分别指定在处理实际开始之前或者完成之后进行操作。
BEGIN语句最常用于建立变量或显示标题。
另一方面,END语句可用于在程序结束后继续进行处理。
在前面的示例中,利用以下例程生成了物品的总价值:行进行打印也导致它始终不打印出来。
但是,利用 END语句可以避免这一问题:作为独立例程使用,它也可以置入到先前的代码列表,添加更多信息并生成更完整的报表:该过程最常见的目的是创建报表的标题。
此例程的语法类似于AWK 工具可以从文件中读取其输入,正如在此之前所有示例所做的那样,它也可以从其他命令的输出中获取输入。
例如:如 grep。
该过程允许您在离开所选定字段前对文件执行其他操作。
类似于解释程序,AWK 使用输出改向操作符 >和 >>将其输出放入文件中而不是标准输出设备。
这些符号的作用类似于它们在解释程序中的对应符号,因此 >在不存在文件时创建文件,而 >>追加到现有文件的尾部。
请看以下的示例:号中,否则它只是一个未初始化的 AWK 变量,而将指令联接起来会在 AWK 中产生错误。
(如果不正确地使用改向符号,则 AWK 无法了解该符号意味着“改向”还是一个关系操作符。
)在 AWK 中输出到管道也类似于解释程序中所实现的相同操作。
要将打印命令的输出发送到管道中,可以在打印命令后附加管道符号以及命令的名称,如下所示:AWK 所使用的命令可以来自两个地方。
首先,可以在命令行中指定它们,如示例中所示。
其次,它们可以由源文件提供。
如果是这种情况,通过 -f选项将这种情况向AWK 发出警告。
演示如下:命令行中的命令与文件名称。
如果简单的输出不能处理您的程序中所需要的复杂信息,则可以尝试由 printf命令获得的更加复杂的输出,其语法是打印数值的规格,可以定义该格式。
格式规格包含一个跟有字母的 %。
类似于打印命令,printf不必包含在圆括号中,但是可以认为使用圆括号是一种良好的习惯。
下表列出 printf命令提供的各种规格。
规格说明%c打印单个 ASCII 字符%d打印十进制数%e打印数字的科学计数表示%f打印浮点表示%g打印 %e 或 %f;两种方式都更简短%o打印无符号的八进制数s打印 ASCII 字符串%x打印无符号的十六进制数%%打印百分号;不执行转换可以在 % 与字符之间提供某些附加的格式化参数。
这些参数进一步改进数值的打印方式: 参数说明-将字段中的表达式向左对齐,width根据需要将字段补齐到指定宽度(前导零使用零将字段补齐).prec小数点右面数字的最大字符串宽度或最大数量printf命令能够控制并将数值从一种格式转换为另一种格式。
当需要打印变量的值时,只需提供一种规格,指示 printf如何打印信息(通常包含在双引号中)即可。
必须为每个传递到 printf的变量包含一个规格参数;如果包含过少的参数,则 printf不会打印所有的数值。
处理错误AWK 工具报告所发生错误的方式很令人恼火。
一个错误会阻碍任何操作的进行,所提供的错误信息非常含混不清:源文件的一个有力论据。
切记有两条规则可以帮助您避免出现语法错误:1. 确保命令位于括号中,而括号位于单引号中。
没有使用这些字符之一必然导致程序无法运行。
2. 搜索命令需要位于斜线之间。
要找出住在印第安那州的员工,您必须使用“/IN/”而不是“IN”。
结论尽管 AWK 完全代表另外的含意,但它应该是管理员智能工具包的首字母缩写。
连同SED 一起,AWK 实用工具是 Linux 管理员所拥有的功能最强大和灵活的工具之一。
通过了解其语言的一些特性,您可以开辟出能够简化任务的领域,否则这些任务将会是非常费时和困难的。
Emmett Dulaney (edulaney@) 获得了 18 种供应商认证。
他编写了数本关于 Linux、UNIX 和认证研究的书籍,并在许多会议上进行了演讲,而且他是 Mercury Technical Solutions 的前合作伙伴。