手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

awk(1)

名称

awk - 模式扫描和处理语言

用法概要

/usr/bin/awk [-f progfile] [-Fc] [' prog '] [parameters] [filename]...
/usr/xpg4/bin/awk [-FcERE] [-v assignment]... 'program' -f progfile... 
     [argument]...

描述

nawk(1) 手册页对 /usr/xpg4/bin/awk 实用程序进行了介绍。

/usr/bin/awk 实用程序扫描每个输入 filename,以查找与 prog 指定的模式集中任意项匹配的行。prog 字符串必须包括在单引号 (´) 中,以免被 shell 调用。对于 prog 中的每种模式,当 filename 的某行与该模式匹配时,可以执行关联的操作。模式操作语句集实际上可以显示为 prog 或显示在通过 –f progfile 选项指定的文件中。输入文件按顺序进行读取;如果没有文件,则读取标准输入。文件名 '−' 表示标准输入。

选项

支持以下选项:

–f progfile

awk 使用它从 progfile 读取的模式集。

–Fc

将字符 c 用作字段分隔符 (Field Separator, FS) 字符。请参见下文有关 FS 的讨论。

用法

输入行

每个输入行都与每个模式操作语句的模式部分匹配;关联的操作针对每个匹配的模式执行。任何 var=value 形式的 filename 都被视为赋值,而非文件名,并在作为文件名本应打开时执行。按照这种方式赋值的 VariablesBEGIN 规则中不可用,并且在读取之前指定的文件后赋值。

输入行通常由空格分隔的多个字段组成。(此缺省值可以使用 FS 内置变量或 –Fc 选项进行更改。)缺省情况下忽略前导空格并使用空格和/或制表符分隔字段。但是,如果为 FS 赋予了不包含任何空格的值,则不会忽略前导空格。这些字段表示为 $1$2. . . ;$0 表示整行。

模式操作语句

模式操作语句具有以下形式:

pattern { action }

模式或操作都可以省略。如果没有操作,则显示匹配行。如果没有模式,则针对所有输入行执行操作。模式操作语句使用换行符或分号分隔。

模式为关系表达式和正则表达式的任意布尔组合(!、||、&& 和圆括号)。关系表达式为以下形式之一:

expression relop expression
expression matchop regular_expression

其中 relop 为 C 中六种关系运算符之中的任意一种,而 matchop~(包含)或 !~(不包含)。expression 为算术表达式、关系表达式、特殊表达式

var in array

或者这些表达式的布尔组合。

正则表达式在 egrep(1) 中介绍。在模式中,它们必须使用斜杠括起来。模式中独立的正则表达式应用于整行。正则表达式还可以出现在关系表达式中。一种模式可以由逗号分隔的两种模式组成;在这种情况下,针对第一种模式出现位置和第二种模式出现位置之间的所有行执行操作。

特殊模式 BEGINEND 可以分别用于在读取第一个输入行之前和读取最后一个输入行之后捕获控制。这些关键字不与任何其他模式结合使用。

内置变量

内置变量包括:

FILENAME

当前输入文件的名称

FS

输入字段分隔符正则表达式(缺省值为空格和制表符)

NF

当前记录中字段的数量

NR

当前记录的有序编号

OFMT

编号的输出格式(缺省值为 %.6g

OFS

输出字段分隔符(缺省值为空格)

ORS

输出记录分隔符(缺省值为换行符)

RS

输入记录分隔符(缺省值为换行符)

操作是语句序列。语句可以为下列形式之一:

if ( expression ) statement [ else statement ]
while ( expression ) statement 
do statement while ( expression )
for ( expression ; expression ; expression ) statement
for ( var in array ) statement 
break
continue
{ [ statement ] . . . }
expression      # commonly variable = expression
print [ expression-list ] [ >expression ]
printf format [ ,expression-list ] [ >expression ]
next            # skip remaining patterns on this input line
exit [expr]     # skip the rest of the input; exit status is expr

语句以分号、换行符或右大括号结束。空表达式列表代表整个输入行。表达式根据情况接受字符串或数字值,并使用运算符 +*/%^ 和串联(通过空格表示)构建。运算符 ++−−+=−=*=/=%=^=>>=<<===!=?: 也可用于表达式。变量可以为标量、数组元素(表示为 x[i])或字段。变量初始化为空字符串或零。数组下标可以为任意字符串,而不一定是数字;这允许存在关联内存形式。字符串常量使用引号 ("") 括起来,在其中可识别常用的 C 语言转义符。

print 语句将其参数显示到标准输出,或者某个文件(如果 >expression 存在),或者某个管道(如果 '|cmd' 存在)。print 语句生成的输出以输出记录分隔符结束,每个参数都使用当前的输出字段分隔符分隔。printf 语句按照格式设置其表达式列表的格式(请参见 printf(3C))。

内置函数

算术函数如下:

cos(x)

返回 x 的余弦,其中 x 用弧度表示。(仅适用于 /usr/xpg4/bin/awk。请参见 nawk(1)。)

sin(x)

返回 x 的正弦,其中 x 用弧度表示。(仅适用于 /usr/xpg4/bin/awk。请参见 nawk(1)。)

exp(x)

返回 x 的指数函数。

log(x)

返回 x 的自然对数。

sqrt(x)

返回 x 的平方根。

int(x)

将其参数截断为整数。当 x > 0 时,则将其截断为趋近 0 的值。

字符串函数如下:

index(s, t)

返回字符串 s 中字符串 t 首次出现的位置,或者0 (如果它从未出现过)。

int(s)

s 截断为整数值。如果未指定 s,则使用 $0。

length(s)

在其参数采用字符串的情况下返回其参数的长度,或者在没有参数的情况下返回整行的长度。

split(s, a, fs)

将字符串 s 拆分为数组元素 a[1]、a[2]、 . . .a[n] 并返回 n。使用正则表达式 fs 或字段分隔符 FS(如果未指定 fs)完成分隔。

sprintf(fmt, expr, expr, . . . )

按照 fmt 指定的 printf(3C) 格式设置表达式的格式并返回生成的字符串。

substr(s, m, n)

返回从 m 位置开始的 n 个字符的 s 子字符串。

输入/输出函数如下:

getline

$0 设置为当前输入文件的下一条输入记录。getline 返回1 表示成功输入,0 表示文件结束,−1 表示错误。

大型文件行为

有关 awk 遇到大于或等于 2 GB(231 字节)文件时行为的说明,请参见 largefile(5)

示例

示例 1 显示长度超过 72 个字符的行

下面的示例是一个可由 awk -f examplescript 样式命令执行的 awk 脚本。它显示长度超过 72 个字符的行:

length > 72
示例 2 按照相反的顺序显示字段

下面的示例是一个可由 awk -f examplescript 样式命令执行的 awk 脚本。它按照相反的顺序显示前两个字段:

{ print $2, $1 }
示例 3 按照相反的顺序显示字段并分隔输入字段

下面的示例是一个可由 awk -f examplescript 样式命令执行的 awk 脚本。它以相反的顺序显示前两个输入字段,并使用逗号、空格或制表符分隔:

BEGIN { FS = ",[ \t]*|[ \t]+" }
      { print $2, $1 }

该示例仅适用于 /usr/xpg4/bin/awk

示例 4 对第一列求和,显示总和与平均值。

下面的示例是一个可由 awk -f examplescript 样式命令执行的 awk 脚本。它对第一列求和,并显示总和与平均值:

{ s += $1 }
END  { print "sum is", s, " average is", s/NR }
示例 5 按照相反的顺序显示字段

下面的示例是一个可由 awk -f examplescript 样式命令执行的 awk 脚本。它以相反的顺序显示字段:

{ for (i = NF; i > 0; −−i) print $i }
示例 6 显示 start/stop 对之间的所有行

下面的示例是一个可由 awk -f examplescript 样式命令执行的 awk 脚本。它显示 start/stop 对之间的所有行。

/start/, /stop/
示例 7 显示第一个字段与前一个不同的所有行

下面的示例是一个可由 awk -f examplescript 样式命令执行的 awk 脚本。它显示第一个字段与前一个不同的所有行。

$1 != prev { print; prev = $1 }
示例 8 显示文件并填入页码

下面的示例是一个可由 awk -f examplescript 样式命令执行的 awk 脚本。它显示文件并从 5 开始填入页码:

/Page/	{ $2 = n++; }
     	   { print }
示例 9 显示文件并对其页面编码

假定该程序位于名为 prog 的文件中,则下面的示例显示 input 文件并从 5 开始对其页面进行编码:

example% awk -f prog n=5 input

环境变量

有关影响 awk 执行的以下环境变量的描述,请参见 environ(5):LANG、LC_ALL、LC_COLLATE、LC_CTYPE、LC_MESSAGES、NLSPATH 和 PATH。

LC_NUMERIC

确定解释数字输入时使用的基数字符,在数字和字符串值之间执行转换并设置数字输出的格式。不管语言环境是什么,句点字符(POSIX 语言环境的小数点字符)都为处理 awk 程序(包括命令行参数赋值)时可识别的小数点字符。

属性

有关下列属性的说明,请参见 attributes(5)

/usr/bin/awk

属性类型
属性值
可用性
system/core-os
CSI
Not Enabled(未启用)

/usr/xpg4/bin/awk

属性类型
属性值
可用性
system/xopen/xcu4
CSI
Enabled(已启用)
接口稳定性
Committed(已确定)
标准
请参见 standards(5)

另请参见

egrep(1)grep(1)nawk(1)sed(1)printf(3C)attributes(5)environ(5)largefile(5)standards(5)

附注

如果涉及字段,则输出中不保留输入空格。

数字和字符串之间没有显式转换。要强制将表达式视为数字,请向其添加 0。要强制将表达式视为字符串,请将空字符串 ("") 与其串联。