awk使用大全
内容提要: awk是AIX和UNIX上的最强大的文字匹配搜索工具。本文详细介绍awk的适用方法。
awk 命令的输入
awk 命令的输出
通过记录和字段的文件处理
awk 命令编程语言 :
模式
操作
变量
特殊变量
标志
示例
说明:
在文件中查与模式匹配的行,然后在它们上面执行特定的操作。
语法
awk [ -F Ere ] [ -v Assignment ] ... { -f ProgramFile | ' Program ' } [ [ File ... | Assignment ... ] ] ...
描述
awk 命令利用一组用户提供的指令来将一组文件和用户提供的扩展正则表达式比较,一次一行。然后在任何与扩展正则表达式匹配的行上执行操作。 awk 处理的最大记录大小为 10KB。
awk 命令的模式搜索比 grep 命令的搜索更常用,且它允许用户在输入文本行上执行多个操作。 awk 命令编程语言不需要编译,并允许用户使用变量、数字函数、字符串函数和逻辑
运算符。
awk 命令受到 LANG 、 LC_ALL 、 LC_COLLATE 、 LC_CTYPE 、 LC_MESSAGES 、 LC_NUMERIC 、 NLSPATH 和 PATH 环境变量的影响。
awk 命令的输入
awk 命令采取两种类型的输入:输入文本文件和程序指令。
输入文本文件
搜索和操作在输入文本文件上执行。文件如下指定:
在命令行指定 File 变量。
修改特殊变量 ARGV 和 ARGC 。
在未提供 File 变量的情况下提供标准输入。
如果用 File 变量指定多个文件,则文件以指定的顺序处理。
程序指令
用户提供的指令控制 awk 命令的操作。这些指令来自命令行的‘ Program ’变量或来自用 -f 标志和 ProgramFile 变量一起指定的文件。如果指定多个程序文件,这些文件以指定的顺序串联,且使用指令的生成的顺序。
awk 命令的输出
awk 命令从输入文本文件中的数据产生三种类型的输出:
· 选定的数据可以打印至标准输出,此输出完全同于输入文件。
· 输入文件的选定部分可以更改。
· 选定数据可以更改并可打印至标准输出,此输出可以同于或不同于输入文件的内容。
可以在同一个文件上执行所有三种类型的输出。 awk 命令识别的编程语言允许用户重定向输出。
通过记录和字段的文件处理
文件以下列方式处理:
1. awk 命令扫描它的指令,并执行任何指定为在读取输入文件前发生的操作。
awk 编程语言中的 BEGIN 语句允许用户指定在读取第一个记录前要执行的一组指令。这对于初始化特殊变量特别有用。
2. 从输入文件读取一个记录。
记录是由记录分隔符隔开的一组数据。记录分隔符的缺省值是换行字符,它使文件中的每一行成为一个单独的记录。记录分隔符可以通过设置 RS 特殊变量来更改。
3. 记录是相对于 awk 命令的指令指定的每种模式比较。
命令指令可以指定应比较记录内的特定字段。缺省情况下,字段由空白区(空格或跳格)隔开。每个字段由一个字段变量表示。记录中的第一个字段指定为 $1 变量,第二个字段指定为 $2 变量,以此类推。整个记录指定为 $0 变量。字段分隔符可以通过在命令行使用 -F 标志或通过设置 FS 特殊变量来更改。FS 特殊变量可以设置为下列值:空格、单个字符或扩展正则表达式。
4. 如果一个记录与一个模式相匹配,则任何与该模式相关的操作都在该记录上执行。
5. 在记录和每个模式比较且执行了所有指定操作以后,从输入读取下一个记录;在从输入文件读取所有的记录之前,该进程重复。
6. 如果已经指定了多个输入文件,则下一个文件打开,且在读取所有的输入文件之前,该进程重复。
7. 在读取了最后一个文件中的最后一个记录后, awk 命令执行任何指定为在输入处理后发生的指令。
awk 编程语言中的 END 语句允grep命令有什么用许用户指定在读取最后一个记录后要执行的操作。这对于发送有关 awk 命令完成了什么工作的消息特别有用。
awk 命令编程语言
awk 命令编程语言由以下格式的语句构成:
Pattern { Action }
如果一个记录与指定模式相匹配,或包含与该模式匹配的字段,则执行相关的操作。可以指定没有操作的模式,这种情况下,包含该模式的整行写至标准输出。为每个输入记录执行指定的没有模式的操作。
模式
在 awk 命令语言语法中使用四种类型的模式:
正则表达式
关系表达式
模式的组合
BEGIN 和 END 模式
正则表达式
aw k 命令使用的扩展正则表达式类似于 grep 或 egrep 命令使用的表达式。扩展正则表达式
的最简单的形式就是包括在斜杠中的一串字符。例如,假定一个名为 testfile 的文件具有以下内容:
smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
输入以下一行命令:
awk '/smi/' testfile
将把包含 smi 字符串的具体值的所有记录打印至标准输出。在这个示例中, awk 命令的程
序 '/smi/' 是一个没有操作的模式。输出是:
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
以下特殊字符用于形成扩展正则表达式:
字符 | 功能 |
+ | 指定如果一个或多个字符或扩展正则表达式的具体值(在 + (加号)前)在这个字符串中,则字符串匹配。命令行: awk '/smith+ern/' testfile 将包含字符 smit,后跟一个或多个 h 字符,并以字符 ern 结束的字符串的任何记录打印至标准输出。此示例中的输出是: smithern, harry smithhern, anne |
? | 指定如果零个或一个字符或扩展正则表达式的具体值(在 ?(问号)之前)在字符串中,则字符串匹配。命令行: awk '/smith?/' testfile 将包含字符 smit,后跟零个或一个 h 字符的实例的所有记录打印至标准输出。此示例中的输出是: smith, alan smithern, harry smithhern, anne smitters, alexis |
| | 指定如果以 |(垂直线)隔开的字符串的任何一个在字符串中,则字符串匹配。命令行: awk '/allen | alan /' testfile 将包含字符串 allen 或 alan 的所有记录打印至标准输出。此示例中的输出是: smiley, allen smith, alan |
( ) | 在正则表达式中将字符串组合在一起。命令行: awk '/a(ll)?(nn)?e/' testfile 将具有字符串 ae 或 alle 或 anne 或 allnne 的所有记录打印至标准输出。此示例中的输出是: smiley, allen smithhern, anne |
{ m } | 指定如果正好有 m 个模式的具体值位于字符串中,则字符串匹配。命令行: awk '/l{2}/' testfile 打印至标准输出 smiley, allen |
{ m, } | 指定如果至少 m 个模式的具体值在字符串中,则字符串匹配。命令行: awk '/t{2,}/' testfile 打印至标准输出: smitters, alexis |
{ m, n } | 指定如果 m 和 n 之间(包含的 m 和 n)个模式的具体值在字符串中(其中 m <= n ),则字符串匹配。命令行: awk '/er{1, 2}/' testfile 打印至标准输出: smithern, harry smithern, anne smitters, alexis |
[ String ] | 指定正则表达式与方括号内 String 变量指定的任何字符匹配。命令行: awk '/sm[a-h]/' testfile 将具有 sm 后跟以字母顺序从 a 到 h 排列的任何字符的所有记录打印至标准输出。此示例的输出是: smawley, andy |
[^ String ] | 在 [ ](方括号)和在指定字符串开头的 ^ (插入记号) 指明正则表达式与方括号内的任何字符 不 匹配。这样,命令行: awk '/sm[^a-h]/' testfile 打印至标准输出: smiley, allen smith, alan smithern, harry smithhern, anne smitters, alexis |
~,!~ | 表示指定变量与正则表达式匹配(代字号)或不匹配(代字号、感叹号)的条件语句。命令行: awk '$1 ~ /n/' testfile 将第一个字段包含字符 n 的所有记录打印至标准输出。此示例中的输出是: smithern, harry smithhern, anne |
^ | 指定字段或记录的开头。命令行: awk '$2 ~ /^h/' testfile 将把字符 h 作为第二个字段的第一个字符的所有记录打印至标准输出。此示例中的输出是: smithern, harry |
$ | 指定字段或记录的末尾。命令行: awk '$2 ~ /y$/' testfile 将把字符 y 作为第二个字段的最后一个字符的所有记录打印至标准输出。此示例中的输出是: smawley, andy smithern, harry |
. (句号) | 表示除了在空白末尾的终端换行字符以外的任何一个字符。命令行: awk '/a..e/' testfile 将具有以两个字符隔开的字符 a 和 e 的所有记录打印至标准输出。此示例中的输出是: smawley, andy smiley, allen smithhern, anne |
* (星号) | 表示零个或更多的任意字符。命令行: awk '/a.*e/' testfile 将具有以零个或更多字符隔开的字符 a 和 e 的所有记录打印至标准输出。此示例中的输出是: smawley, andy smiley, allen smithhern, anne smitters, alexis |
\ (反斜杠) | 转义字符。当位于在扩展正则表达式中具有特殊含义的任何字符之前时,转义字符除去该字符的任何特殊含义。例如,命令行: /a\/\// 将与模式 a // 匹配,因为反斜杠否定斜杠作为正则表达式定界符的通常含义。要将反斜杠本身指定为字符,则使用双反斜杠。有关反斜杠及其使用的更多信息,请参阅以下关于转义序列的内容。 识别的转义序列 |
awk 命令识别大多数用于 C 语言约定中的转义序列,以及 awk 命令本身用作特殊字符的几个转义序列。转义序列是:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论