awk 命令
用途
在文件中查找与模式匹配的行并在这些行上执行指定的操作。
语法
awk [ -u ] [ -F Ere ] [ -v assignment ] ... { -f ProgramFile | 'Program' } [[ File ... | assignment ...]] ...
描述
awk 命令利用一组用户提供的指令来将一组文件与用户提供的扩展正则表达式比较,一次一行。 然后在任何与扩展正则表达式匹配的行上执行操作。
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 命令识别的编程语言允许用户重定向输出。
通过记录和字段的文件处理
文件以下列方式处理:
- awk 命令扫描它的指令,并执行任何指定为在读取输入文件前发生的操作。
awk 编程语言中的 BEGIN 语句允许用户指定在读取第一个记录前要执行的一组指令。 这对于初始化特殊变量特别有用。
- 从输入文件读取一个记录。
记录是由记录分隔符隔开的一组数据。 记录分隔符的缺省值是换行符,它使文件中的每一行成为一个单独的记录。 记录分隔符可以通过设置 RS 特殊变量来更改。
- 将针对 awk 命令的指示信息所指定的每种模式比较该记录。
命令指令可以指定应比较记录内的特定字段。 缺省情况下,字段由空白区(空格或跳格)隔开。 每个字段由一个字段变量表示。 记录中的第一个字段指定为 $1 变量,第二个字段指定为 $2 变量,以此类推。 整个记录指定为 $0 变量。 可通过在命令行上使用 -F 标志或通过设置 外勤人员 特殊变量来更改字段分隔符。 可以将 外勤人员 特殊变量设置为以下值 :blank , single character 或 扩展正则表达式。
- 如果一个记录与一个模式相匹配,那么任何与该模式相关的操作都在该记录上执行。
- 在记录和每个模式比较且执行了所有指定操作以后,从输入读取下一个记录;在从输入文件读取所有的记录之前,该进程重复。
- 如果已经指定了多个输入文件,那么下一个文件打开,且在读取所有的输入文件之前,该进程重复。
- 在读取了最后一个文件中的最后一个记录后,
awk 命令执行任何指定为在输入处理后发生的指令。
awk 编程语言中的 END 语句允许用户指定在读取最后一个记录后要执行的操作。 这对于发送有关 awk 命令完成了什么工作的消息特别有用。
awk 命令编程语言
awk 命令编程语言由以下格式的语句构成:
模式 { 操作 }
如果一个记录与指定模式相匹配,或包含与该模式匹配的字段,那么执行相关的操作。 可以指定没有操作的模式,这种情况下,包含该模式的整行写至标准输出。 为每个输入记录执行指定的没有模式的操作。
模式
在 awk 命令语言语法中使用四种类型的模式:
正则表达式
awk 命令使用的扩展正则表达式类似于 grep 或 egrep 命令使用的表达式。 扩展正则表达式的最简单的形式就是包括在斜杠中的一串字符。 例如,假定有一个文件testfile具有以下内容:
smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis输入以下一行命令:
awk '/smi/' testfile将打印到所有包含出现字符串的记录的标准输出smi。在此示例中,程序'/smi/'对于 奥克 命令是不执行任何操作的模式。 输出为:
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis以下特殊字符用于形成扩展正则表达式:
| 字符 | 函数 |
|---|---|
| + | 指定如果一个或多个字符或扩展正则表达式的具体值(在 +(加号)前)在这个字符串中,那么字符串匹配。 命令行:将包含带有字符的字符串的任何记录打印到标准输出smit,后跟一个或多个h字符,然后以字符结尾ern. 此示例中的输出为: |
| ? | 指定如果零个或一个字符或扩展正则表达式的具体值(在 ? (问号)之前)在字符串中,那么字符串匹配。 命令行:打印至包含字符的所有记录的标准输出smit,后跟零个或一个实例h字符。 此示例中的输出是: |
| | | 指定如果以 |(垂直线)隔开的字符串的任何一个在字符串中,那么字符串匹配。 命令行:打印到包含字符串的所有记录的标准输出allen或alan. 此示例中的输出为: |
| ( ) | 在正则表达式中将字符串组合在一起。 命令行:打印到带有字符串的所有记录的标准输出ae或alle或anne或allnne. 此示例中的输出为: |
| {m} | 指定如果正好有 m 个模式的具体值位于字符串中,那么字符串匹配。 命令行:打印至标准输出 |
| {m ,} | 指定如果至少 m
个模式的具体值在字符串中,那么字符串匹配。 命令行:打印至标准输出: |
| {m , n} | Specifies that a string matches if between M and N, inclusive, occurrences of the pattern are within the string ( where M <= N). 命令行:打印至标准输出: |
| [字符串] | 指定正则表达式与方括号内 String 变量指定的任何字符匹配。 命令行:打印到具有字符的所有记录的标准输出sm后跟任何字符 (按字母顺序排列)a至h. 此示例中的输出为: |
| [^ 字符串] | 在 [ ](方括号)和在指定字符串开头的 ^ (插入记号) 指明正则表达式与方括号内的任何字符不匹配。 这样,命令行:打印至标准输出: |
| ~,!~ | 表示指定变量与正则表达式匹配(代字号)或不匹配(代字号、感叹号)的条件语句。 命令行:打印至其第一个字段包含字符的所有记录的标准输出n.此示例中的输出是: |
| ^ | 指定字段或记录的开头。 命令行:打印至具有该字符的所有记录的标准输出h作为第二字段的第一个字符。 此示例中的输出是: |
| $ | 指定字段或记录的末尾。 命令行:打印至具有该字符的所有记录的标准输出y作为第二个字段的最后一个字符。 此示例中的输出是: |
| . (句点) | 表示除了在空白末尾的终端换行符以外的任何一个字符。 命令行:打印到具有字符的所有记录的标准输出a以两个字符分隔。 此示例中的输出是: |
| *(星号) | 表示零个或更多的任意字符。 命令行:打印到具有字符的所有记录的标准输出a并且 e 由零个或零个以上字符分隔。 此示例中的输出是: |
| \ (反斜杠) | 转义字符。 当位于在扩展正则表达式中具有特殊含义的任何字符之前时,转义字符除去该字符的任何特殊含义。 例如,命令行:将与模式 a // 匹配,因为反斜杠否定斜杠作为正则表达式定界符的通常含义。 要将反斜杠本身指定为字符,那么使用双反斜杠。 有关反斜杠及其使用的更多信息,请参阅以下关于转义序列的内容。 |
识别转义序列
awk 命令识别大多数用于 C 语言约定中的转义序列,以及 awk 命令本身用作特殊字符的几个转义序列。 转义序列是:
| 转义序列 | 表示的字符 |
|---|---|
| \" | \"(双引号)标记 |
| \/ | /(斜杠)字符 |
| \民主 | 其编码由 1、2 或 3 位八进制整数表示的字符,其中 d 表示一个八进制数位 |
| \\ | \ ( 反斜杠 ) 字符 |
| \a | 警告字符 |
| \b | 退格字符 |
| \f | 换页字符 |
| \n | 换行符(请参阅以下的注) |
| \r | 回车字符 |
| \t | 跳格字符 |
| \v | 垂直跳格 |
注:除了在 gsub、match、split 和 sub 内置函数中,扩展正则表达式的匹配都基于输入记录。 记录分隔符字符(缺省情况下为换行符)不能嵌套在表达式中,且没与记录分隔符字符匹配的表达式。 如果记录分隔符不是换行符,那么可与换行符匹配。 在指定的四个内置函数中,匹配基于文本字符串,且任何字符(包含记录分隔符)可以嵌套在模式中,这样模式与适当的字符相匹配。 然而,用 awk 命令进行的所有正则表达式匹配中,在模式使用一个或多个 NULL(空)字符将生成未定义的结果。
关系表达式
The relational operators < (less than), > (greater than), <= (less than or equal to), >= (greater than or equal to), = = (equal to), and ! = (not equal to) can be used to form patterns. 例如,模式:
$1 < $4将与第一个字段小于第四个字段的记录匹配。 关系运算符还和字符串值一起使用。 例如:
$1 =! "q"匹配第一个字段不是以下字段的所有记录:q. 字符串值也可以在整理值上匹配。 例如:
$1 >= "d"匹配第一个字段以以下字符开头的所有记录:a,b,c,或d如果未提供其他信息,那么会将字段变量作为字符串值进行比较。
模式组合
可以使用三种选项组合模式:
- 范围由两个以 a , (逗号) 分隔的模式指定。 操作在每个以匹配第一个模式的记录开始的每个记录上执行,并通过匹配第二个模式的记录(包含此记录)继续。 例如:
匹配包含字符串的记录begin以及它与包含字符串的记录之间的每条记录end,包括包含字符串的记录end./begin/,/end/ - 括号 ( ) 将模式组合在一起。
- 布尔运算符 ||(或)&&(和)以及 ! (不)将模式组合成如果它们求值为真则匹配,否则不匹配的表达式。 例如,模式:
匹配第一个字段所在的记录al第二个字段是123.$1 == "al" && $2 == "123"
BEGIN 和 END 模式
用 BEGIN 模式指定的操作在读取任何输入之前执行。 用 END 模式指定的操作在读取了所有输入后执行。 允许多个 BEGIN 和 END 模式,并以指定的顺序处理它们。 在程序语句中 END 模式可以在 BEGIN 模式之前。 如果程序仅由 BEGIN 语句构成,那么执行操作且不读取输入。 如果程序仅由 END 语句构成,那么在任何操作执行前读取所有输入。
操作
有多种类型的操作语句:
操作语句
操作语句括在 { } (花括号) 中。 如果语句指定为没有模式,那么它们在每个记录上执行。 在括号里可以指定多个操作,但操作间必须以换行符或 ;(分号)分隔,且语句以它们出现的顺序处理。 操作语句包含:
- 算术语句
- 算术运算符 +(加号), -(减号), /(除号), ^ (幂), *(乘号), %(系数)用于格式:
Expression Operator Expression这样,语句:
$2 = $1 ^ 3将第一个升为三次方的字段的值指定给第二个字段。
- 一元语句
- 一元 -(减号)和一元
+(加号)如在 C 编程语言中操作:
+Expression or -Expression
- 增量和减量语句
- 增量前语句和减量前语句如在 C 编程语言中操作:
++Variable or --Variable增量后语句和减量后语句如在 C 编程语言中操作:
Variable++ or Variable--
- 赋值语句
- 赋值运算符 +=(加)、-=(减)、/=(除)和 *=(乘)如在 C 编程语言中操作,格式为:
Variable += ExpressionVariable -= ExpressionVariable /= ExpressionVariable *= Expression例如,语句:
$1 *= $2将字段变量 $1 乘以字段变量 $2,然后将新值指定给 $1 。
赋值运算符 ^=(幂)和 %=(系数)具有以下格式:
Variable1^=Expression1和
Variable2%=Expression2并且它们等同于 C 编程语言语句:
Variable1=pow(Variable1, Expression1)和
Variable2=fmod(Variable2, Expression2)其中pow是 波 子例程和fmod是 菲莫德 子例程。
- 字符串串联语句
- 字符串值可以与其陈述并排并置。 例如:
$3 = $1 $2将字段变量 $1 和 $2 中的字符串的并置指定给字段变量 $3。
内置函数
awk 命令语言使用算术函数、字符串函数和一般函数。 如果打算编写一个文件,且稍后在同一个程序里读取它,那么 close 子例程语句是必需的。
算术函数
以下算术函数执行与 C 语言中名称相同的子例程相同的操作:
| 项 | 描述 |
|---|---|
| atan2( Y, X ) | 返回 y/ x 的反正切。 |
| cos ( X ) | 返回 x 的余弦; x 是弧度。 |
| 罪 ( X ) | 返回 x 的正弦; x 是弧度。 |
| exp ( X ) | 返回 x 的指数函数。 |
| 日志 ( X ) | 返回 x 的自然对数。 |
| sqrt ( X ) | 返回 x 平方根。 |
| int ( X ) | 返回 x 的截断至整数的值。 |
| 兰德 ( ) | Returns a random number N, with 0 <= N < 1. |
| srand ( [Expr] ) | 将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。 返回先前的种子值。 |
字符串函数
字符串函数是:
| 项 | 描述 |
|---|---|
| gsub ( Ere, Repl, [ In ] ) | 除了正则表达式所有具体值被替代这点,它和 sub 函数完全一样地执行。 |
| sub ( Ere, Repl, [ In ] ) | 用 Repl 参数指定的字符串替换 In 参数指定的字符串中的由 Ere 参数指定的扩展正则表达式的第一个具体值。 sub 函数返回替换的数量。 An & (ampersand) appearing in the string specified by the 雷普尔 parameter is replaced by the string in the 在 parameter that matches the extended regular expression specified by the 埃雷 parameter. 如果未指定 In 参数,缺省值是整个记录($0 记录变量)。 |
| 索引 ( String1, String2 ) | 在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。 如果 String2 参数不在 String1 参数中出现,那么返回 0(零)。 |
| 长度 [(字符串)] | 返回 String 参数指定的字符串的长度(字符形式)。 如果未给出 String 参数,那么返回整个记录的长度( $0 记录变量)。 |
| blength [(字符串)] | 返回 String 参数指定的字符串的长度(以字节为单位)。 如果未给出 String 参数,那么返回整个记录的长度( $0 记录变量)。 |
| substr ( String, M, [ N ] ) | 返回具有 N 参数指定的字符数量子串。 子串从 String 参数指定的字符串取得,其字符以 M 参数指定的位置开始。 M 参数与 字符串 参数中的第一个字符一起指定为数字 1。 如果未指定 N 参数,那么子字符串的长度将从 M 参数指定的位置开始,直到 字符串 参数. 结束为止。 |
| 匹配 ( 字符串, 埃雷 ) | 在 String 参数指定的字符串(Ere 参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1 开始编号,或如果 Ere 参数不出现,那么返回 0(零)。 RSTART 特殊变量设置为返回值。 RLENGTH 特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,那么设置为 -1(负一)。 |
| 拆分 ( 字符串, A, [埃雷] ) | 将由 字符串 参数指定的字符串分割为数组元素 A[1] 2 A[2] ,. . , A[N] ,并且返回 N 变量的值。 此分隔可以通过 Ere 参数指定的扩展正则表达式进行,或用当前字段分隔符(FS 特殊变量)来进行(如果没有给出 Ere 参数)。 除非上下文指明特定的元素还应具有一个数字值,否则 A 数组中的元素用字符串值来创建。 |
| tower ( 字符串 ) | 返回 String 参数指定的字符串,字符串中每个大写字符将更改为小写。 大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。 |
| Toupper ( 字符串 ) | 返回 String 参数指定的字符串,字符串中每个小写字符将更改为大写。 大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。 |
| sprintf (格式, Expr, Expr, . . . ) | 根据 Format 参数指定的 printf 子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。 |
常规函数
一般函数是:
| 项 | 描述 |
|---|---|
| 关闭 ( 表达式 ) | 使用相同的字符串值 表达式 参数关闭由 打印 或 普林特夫 语句打开的文件或管道,或者关闭对 格斯特林 函数的调用。 如果文件或管道成功关闭,那么返回 0;其他情况下返回非零值。 如果打算写一个文件,并稍后在同一个程序中读取文件,那么 close 语句是必需的。 |
| 系统 (命令 ) | 执行 Command 参数指定的命令,并返回退出状态。 等同于 system 子例程。 |
| 表达式 | getline [ Variable ] | 从来自 Expression 参数指定的命令的输出中通过管道传送的流中读取一个输入记录,并将该记录的值指定给 Variable 参数指定的变量。 如果当前未打开将 Expression 参数的值作为其命令名称的流,那么创建流。 创建的流等同于调用 popen 子例程,此时 Command 参数取 Expression 参数的值且 Mode 参数设置为一个是 r 的值。 对 格斯特林 函数的每个后续调用都将读取另一个记录,只要流保持打开,并且 表达式 参数求值为同一字符串。 如果未指定 Variable 参数,那么 $0 记录变量和 NF 特殊变量设置为从流读取的记录。 |
| 格斯特林 [ 变量 ] < 表达式 | 从 Expression 参数指定的文件读取输入的下一个记录,并将 Variable 参数指定的变量设置为该记录的值。 对 格斯特林 函数的每个后续调用都将读取另一个记录,只要流保持打开,并且 表达式 参数求值为同一字符串。 如果未指定 Variable 参数,那么 $0 记录变量和 NF 特殊变量设置为从流读取的记录。 |
| getline [ 变量 ] | 将 Variable 参数指定的变量设置为从当前输入文件读取的下一个输入记录。 如果未指定 Variable 参数,那么 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量。 |
注:所有 getline 函数的格式对于成功输入返回 1,对于文件结束返回零,对于错误返回 -1。
用户定义的函数
用户定义的函数以下列格式说明:
function Name (Parameter, Parameter,...) { Statements }函数可以指向 awk 命令程序中的任何位置,且它的使用可以优先于它的定义。 此函数的作用域是全局的。
函数参数可以是标量或数组。 参数名称对函数而言是本地的;所有其他变量名称都是全局的。 同一个名称不应用作不同的实体;例如,一个参数名称不能用作函数名称又用作特殊变量。 具有全局作用域的变量不应共享一个函数的名称。 同个作用域中的标量和数组不应具有同一个名称。
函数定义中的参数数量不必和调用函数时使用的参数数量匹配。 多余的形式参数可用作本地变量。 额外的标量参数初始化后具有等同于空字符串和数字值为 0(零)的字符串值;额外的数组参数初始化为空数组。
当调用函数时,函数名称和左括号之间没有空格。 函数调用可以是嵌套的或循环的。 从任何嵌套的或循环函数函数调用返回时,所有调用函数的参数的值应保持不变,除了引用传送的数组参数。 return 语句可用于返回一个值。
在函数定义内,在左 { ( 花括号 ) 之前和右 } ( 花括号 ) 之后的换行符是可选的。
函数定义的一个示例是:
function average ( g,n)
{
for (i in g)
sum=sum+g[i]
avg=sum/n
return avg
} 函数平均值被传递到一个数组,g,还有一个变量,n,其中包含数组中的元素数。 然后函数获得一个平均值并返回它。
条件语句
awk 命令编程语言中的大部分条件语句和 C 编程语言中的条件语句具有相同的语法和功能。 所有条件语句允许使用{ } (花括号) 将语句组合在一起。 可以在条件语句的表达式部分和语句部分之间使用可选的换行符,且换行符或 ;(分号)用于隔离 { } (花括号) 中的多个语句。 C 语言中的六种条件语句是:
| 项 | 描述 |
|---|---|
| IF | 需要以下语法: if ( 表达式 ) { 语句} [ else 操作 ] |
| while | 需要以下语法: while ( 表达式 ) { 语句 } |
| for | 需要以下语法: 为 ( 表达式 ; 表达式 ; 表达式 ) { 语句 } |
| break | 当 break 语句用于 while 或 for 语句时,导致退出程序循环。 |
| CONTINUE | 当 continue 语句用于 while 或 for 语句时,使程序循环移动到下一个迭代。 |
awk 命令编程语言中的五种不遵循 C 语言规则的条件语句是:
| 项 | 描述 |
|---|---|
| 或 ... | 需要以下语法: for ( Variable in Array ) { Statement } for...in 语句将 Variable 参数设置为 Array 变量的每个索引值,一次一个索引且没有特定的顺序,并用每个迭代来执行 Statement 参数指定的操作。 请参阅 delete 语句以获得 for...in 语句的示例。 |
| 如果 ... in | 需要以下语法: if ( Variable in Array ) { Statement } if...in 语句搜索是否存在的 Array 元素。 如果找到 Array 元素,就执行该语句。 |
| 删除 | 需要以下语法: 删除 阵列 [ 表达式 ] delete 语句删除 Array 参数指定的数组元素和 Expression 参数指定的索引。 例如,语句: 将删除该系统的每个元素g[]阵列。 |
| EXIT | 需要以下语法: exit [ 表达式 ] 退出 语句首先按操作发生的顺序调用所有 结束 操作,然后以 表达式 参数指定的退出状态终止 奥克 命令。 如果 exit 语句在 END 操作中出现,那么不调用后续 END 操作。 |
| # | 需要以下语法: # 注释 # 语句放置注释。 注释应始终以换行符结束,但可以在一行上的任何地方开始。 |
| 下一步 | 停止对当前输入记录的处理,从下一个输入记录继续。 |
输出语句
awk 命令编程语言的两种输出语句是:
| 项 | 描述 |
|---|---|
| 需要以下语法: print [ ExpressionList ] [ 重定向 ] [ Expression ] print 语句将 ExpressionList 参数指定的每个表达式的值写至标准输出。 每个表达式由 OFS 特殊变量的当前值隔开,且每个记录由 ORS 特殊变量的当前值终止。 可以使用 重定向 参数来重定向输出,该参数可以使用> (大于) ,>> (大于两倍) 和 | (管道) 指定三个输出重定向。 重定向 参数指定如何将输出重定向,并且 表达式 参数是文件的路径名 (当 重定向 参数为> 或>> 时) 或命令的名称 (当 重定向 参数是 | 时)。 |
|
| printf | 需要以下语法: printf 格式 [, ExpressionList ] [ 重定向 ] [ Expression ] printf 语句将 ExpressionList 参数指定的表达式以 Format 参数指定的格式写至标准输出。 普林特夫 语句的功能与 普林特夫 命令的功能完全相同,但c转换规范 (%c)。 Redirection 和 Expression 参数与在 print 语句中起相同的作用。 对于c转换规范: 如果自变量具有数字值,那么将输出其编码为该值的字符。 如果值是零或不是字符集中的任何字符的编码,那么行为未定义。 如果自变量不具有数字值,那么输出字符串值的第一个字符;如果字符串不包含任何字符,那么行为未定义。 |
注:如果 Expression 参数为 Redirection 参数指定一个路径名称,那么 Expression 参数将括在双引号中以确保将它当作字符串对待。
变量
变量可以是标量、字段变量、数组或特殊变量。 变量名称不能以数字开始。
变量可仅用于引用。 除了函数参数以外,它们没有明确说明。 未初始化的标量变量和数组元素具有一个为 0(零)的数字值和一个为空字符串(" ")的字符串值。
根据上下文,变量呈现出数字或字符串值。 每个变量可以具有数字值和/或字符串值。 例如:
x = "4" + "8"分配值12到变量x. 对于字符串常量,表达式应括在 "" 中 (双引号) 标记。
数字和字符串间没有显式转换。 要促使将表达式当作一个数字,向它添加 0(零)。 要促使将表达式当作一个字符串,那么添加一个空字符串(" ")。
字段变量 (Field Variables)
字段变量由 $(美元符号)后跟一个数字或数字表达式来表示。 记录中的第一个字段指定为 $1 变量,第二个字段指定为 $2,以次类推。 $0 字段变量指定给整个记录。 新字段变量可以通过指定一个值给它们来创建。 将一个值指定给不存在的字段(即任何大于 $NF 字段变量的当前值的字段)将促使创建任何干扰字段(指定为空字符串),增加 NF 特殊变量的值,并促使重新计算 $0 记录变量。 新字段由当前字段分隔符(FS 特殊变量的值)隔开。 空格和跳格是缺省字段分隔符。 要更改字段分隔符,请使用 -F 标志或 在 awk 命令程序中为 FS 特殊变量指定另一个值。
数组
数组初始为空且它们大小可动态更改。 数组由一个变量和在 [ ](方括号)中的下标来表示。 下标或元素标识符可以是几个字符串,它们提供了一种相关数组能力。 例如,程序:
/red/ { x["red"]++ }
/green/ { y["green"]++ }两个计数的增量red柜台和green计数器。
数组可以用多个下标来建立索引,类似于一些编程语言中的多维数组。 因为 awk 命令的编程数组实际上是一维的,通过并置各独立表达式的字符串值(每个表达式由 SUBSEP 环境变量的值隔开)来将以逗号隔开的下标转换为单个字符串。 所以,以下两个索引操作是等同的:
x[expr1, expr2,...exprn]和
x[expr1SUBSEPexpr2SUBSEP...SUBSEPexprn]当使用 in 运算符时,一个多维 Index 值应包含在圆括号之中。 除了 in 运算符,任何对不存在数组元素的引用将自动创建该元素。
特殊变量
以下变量对于 awk 命令具有特殊含义:
| 项 | 描述 |
|---|---|
| ARGC | ARGV 数组中的元素个数。 此值可以更改。 |
| ARGV | 其每个成员包含
File 变量之一或 Assignment 变量之一的数组按序从命令行取出,并从 0(零)编号至
ARGC -1。 当每个输入文件完成时,
ARGV 数组的下一个成员提供下一个输入文件的名称,除非:
|
| CONVFMT | 将数字转换为字符串的 printf 格式(除了使用 OFMT 特殊变量的输出语句)。 缺省值为“%.6g”。 |
| ENVIRON | 表示运行
awk 命令的环境的数组。 该数组的每个元素在以下格式中: ENVIRON [ "环境变量名称" ]=EnvironmentVariableValue 当 awk 命令开始执行时设置这些值,且到执行结束前一直使用该环境,不考虑 ENVIRON 特殊变量的任何修改。 |
| filename | 当前输入文件的路径名称。 在执行 BEGIN 操作的过程中,FILENAME 的值未定义。 在执行 END 操作的过程中,该值是处理的最后一个输入文件的名称。 |
| FNR | 当前文件中的当前输入记录的个数。 |
| FS | 输入字段分隔符。 缺省值是空格。 如果输入字段分隔符是空格,那么任何数目的语言环境定义的空格可以分隔字段。 FS 特殊变量可以有两种附加的值:
|
| NF | 当前记录中的字段个数,最大数 99 个。 在 开始 操作中,除非先前发出了不带 变量 参数的 格斯特林 函数,否则未定义 NF 特殊变量。 在 结束 操作内, NF 特殊变量保留它对最后一个记录读取的值,除非在输入 结束 操作之前发出了后续的,重定向的 格斯特林 函数 (不带 变量 参数)。 |
| NR | 当前输入记录的个数。 在 BEGIN 操作中,NR 特殊变量的值是 0(零)。 在 END 操作中,值是最后处理的记录的编号。 |
| OFMT | 在输出语句中将数字转换为字符串的 printf 格式。 缺省值为“%.6g”。 |
| OFS | 输出字段分隔符(缺省值是空格)。 |
| 月 | 输出记录分隔符(缺省值是换行符)。 |
| RLENGTH | 由 match 函数来匹配的字符串的长度。 |
| RS | 输入记录分隔符(缺省值是换行符)。 如果 RS 特殊变量为空,那么记录以一个或多个空行的序列隔开;第一个空行或最后一个空行在输入的开始和结束都不会产生空记录;换行符始终是一个字段分隔符,不考虑 FS 特殊变量的值。 |
| 开始 | 由 匹配 函数匹配的字符串的起始位置,从 1 开始编号。 等价于 匹配 函数的返回值。 |
| 子 SEP | 隔开多个下标。 缺省值是 \031。 |
标志
| 项 | 描述 |
|---|---|
| -f ProgramFile | 从 ProgramFile 变量指定的文件获取 awk 命令的指示信息。 如果多次指定 -f 标志,那么文件的并置将按指定顺序用作指令集。 |
| -U | 以未缓存的方式显示输出。 如果使用此标志,那么 awk 命令不会缓冲输出。 它反而会瞬时显示输出。 缺省情况下,awk 命令以缓冲方式显示输出。 |
| -F 埃雷 | 请使用 Ere 变量指定的扩展正则表达式作为字段分隔符。 缺省字段分隔符是空格。 |
| -v 分配 | 将值指定给 awk 命令编程语言的变量。 Assignment 参数的格式是 Name = Value。
Name 部分指定变量的名称并可以是任何下划线、数字或字母字符的组合,但它必须以字母字符或下划线开头。 Value
部分也由下划线、数字和字母数字组成,且前面和后面都有一个 "(双引号字符,类似于字符串值)。 如果 Value
部分是数字,那么也将为变量指定数字值。 -v 标志指定的赋值在执行 awk 命令程序的任何部分之前发生,包含 BEGIN 节。 |
| 赋值 | 将值指定给 awk 命令编程语言的变量。 它与带有 -v 标志的 分配 变量具有相同的形式和功能,但处理每个变量的时间除外。 Assignment 参数在处于命令行时跟在其后的输入文件(由 File 变量指定)之前处理。 如果指定 Assignment 参数仅优先于多个输入文件的第一个,那么赋值在 BEGIN 节后(如果有)就处理。 如果 Assignment 参数出现在最后一个文件后,那么在 END 节(如果有)之前处理赋值。 如果不指定输入文件,那么当读取了标准输入时处理赋值。 |
| 文件 | 指定包含要处理的输入的文件的名称。 如果不指定 File 变量,或指定了 -(减号),那么处理标准输入。 |
| '程序' | 包含 awk 命令的指令。 如果不指定 -f 标志, Program 变量应该是命令行上的第一个项。 它应括在 ' '(单引号)中。 |
退出状态
本命令返回以下退出值:
| 项 | 描述 |
|---|---|
| 重大安全事件数量 | 成功完成。 |
| >0 | 发生错误。 |
您可以通过使用 退出 [ 表达式 ] 条件语句来改变程序中的退出状态。
示例
- 要显示长于 72 个字符的文件的行,请输入:
这将选择以下项的每一行:chapter1长度超过 72 个字符的文件,并将这些行写入标准输出,因为未指定 行动 。 制表符以 1 个字符计数。awk 'length >72' chapter1 - 显示单词之间的所有行 start和stop,包含 "start"和 "stop",请输入:
awk '/start/,/stop/' chapter1 - 要运行 奥克 命令程序,sum2.awk,处理文件,chapter1,请输入:
以下程序,sum2.awk计算输入文件的第二列中的数字之和和和平均值,chapter1:awk -f sum2.awk chapter1
第一个操作将每行的第二个字段的值添加到变量中sum. 首次引用时,所有变量都初始化为数字值 0 (零)。 第二个操作前的模式 END 使那些操作在读取了所有输入文件之后才执行。 用于计算平均值的 NR 特殊变量是一个指定已经读取的记录的个数的特殊变量。{ sum += $2 } END { print "Sum: ", sum; print "Average:", sum/NR; } - 要以相反顺序打印前两个字段,请输入:
awk '{ print $2, $1 }' chapter1 - 以下 awk 程序
打印文件的前两个字段chapter2以逗号和/或空格和制表符分隔的输入字段,然后将第一列相加,并打印总和和平均值:awk -f sum3.awk chapter2BEGIN {FS = ",|[ \t]+"} {print $1, $2} {s += $1} END {print "sum is",s,"average is", s/NR }