第 26 章 gawk

gawk filter 和 其 他 的 一 些 filter 的 不 同 之 处 在 于 它 并 没 有 预 先 定 义 需 要 执 行的 任 务 。 本 书 中 前 面 提 到 的 filter 程 序 都 是 为 某 种 特 定 的 任 务 而 设 计 的 , 如 搜 索文 本 或 对 行 进 行 排 序 等 。但 gawk 没 有 事 先 定 义 的 任 务 ,而 是 由 用 户 来 定 义 gawk 需 要 完 成 的 任 务 。 gawk 拥 有 自 己 的 一 套 编 程 语 言 、 命 令 和 操 作 , 用 户 可 以 根 据需 要 完 成 的 任 务 自 己 编 写 相 应 的 gawk 程 序 。 从 这 种 意 义 上 来 说 , gawk 实 际 上是 一 种 可 编 程 的 filter。用 户 可 以 自 己 在 程 序 中 对 数 据 进 行 相 应 的 处 理 。使用 gawk 可 以 象 cat 命 令 一 样 简 单 地 显 示 文 件 中 的 文 本 , 也 可 以 象 grep 命 令 一 样 完 成 文本 搜 索 工 作 , 甚 至 可 以 完 成 wc 命 令 的 字 数 统 计 工 作 。 在 这 些 程 序 中 , 用 户 都可 以 按 照 自 己 的 需 要 加 入 特 殊 的 功 能 , 如 只 显 示 一 行 的 某 一 部 分 , 在 某 一 特 定的 域 中 搜 索 模 式 串 , 或 只 统 计 大 写 的 单 字 等 。

gawk 可 以 直 接 执 行 , 也 可 以 放 置 在 shell 文 件 中 然 后 执 行 。 此 时 shell 文 件的 文 件 名 可 以 认 为 是 用 户 自 己 创 建 的 新 filter。 因 此 , 通 过 使 用 gawk 可 以 定 义自 己 的 filter。 从 这 种 意 义 上 来 说 , gawk 就 有 了 双 重 含 义 。 首 先 , gawk 本 身 是一 个 可 以 直 接 在 命 令 行 上 调 用 的 filter, 这 一 点 与 其 他 的 filter 没 有 差 别 。 另 外 , gawk 又 是 一 个 可 编 程 的 filter, 通 过 它 用 户 可 以 定 义 自 己 的 filter。 本 章 中 将 对gawk 的 这 两 方 面 都 进 行 描 述 。 本 章 的 前 面 部 分 将 对 作 为 普 通 filter 的 gawk 的

特 点 进 行 描 述 。 然 后 , 本 章 还 会 对 如 何 使 用 gawk 定 义 自 己 的 filter 的 方 法 进 行探 讨 。

gawk 应 用 程 序 拥 有 编 程 语 言 所 具 有 的 全 部 灵 活 性 和 复 杂 性 。 gawk 中 拥 有自 己 的 一 套 运 算 符 可 以 用 来 完 成 决 策 和 计 算 工 作 。 在 gawk 中 也 可 以 申 明 变 量并 在 控 制 结 构 中 使 用 这 些 变 量 来 控 制 程 序 执 行 的 顺 序 。 gawk 中 的 许 多 编 程 特 性都 来 自 C 语 言 , 相 应 的 语 法 也 完 全 一 致 。 从 所 有 的 这 些 特 性 可 以 看 出 , gawk 确 实 是 一 种 非 常 强 大 的 编 程 工 具 。

gawk 是 Unix 的 awk 应 用 程 序 的 GNU 版 本 。 awk 起 先 是 作 为 UN IX 操 作系 统 的 标 准 引 用 程 序 设 计 的 。 它 的 作 者 之 一 Brian kernighan, 也 是 UNIX 操 作系 统 的 开 发 者 。 随 后 , 又 推 出 了 awk 的 增 强 版 本 , nawk , 该 版 本 支 持 对 文 件 的操 作 , 可 以 在 同 一 个 程 序 中 访 问 多 个 文 件 。 gawk 则 在 awk 和 nawk 的 基 础 上又 有 增 强 , 它 支 持 awk 和 nawk 的 全 部 功 能 。

gawk 命 令

gawk 命 令 使 用 gawk 指 令 和 文 件 名 列 表 作 为 参 数 。 gawk 指 令 用 单 引 号 封装 作 为 一 个 参 数 读 入 。 gawk 指 令 本 身 则 由 两 段 组 成 , 模 式 段 和 动 作 段 。 动 作 段用 前 后 的 括 号 表 示 。 模 式 段 则 可 以 考 虑 为 一 个 条 件 , 它 可 以 是 一 个 模 式 搜 索 操作 或 编 程 语 言 中 定 义 的 测 试 条 件 。 gawk 应 用 程 序 中 存 在 一 整 套 操 作 符 可 以 构 成非 常 复 杂 的 条 件 。 可 以 将 模 式 搜 索 操 作 看 成 是 检 索 记 录 的 一 种 条 件 。 这 样 , 与

grep 命 令 中 简 单 地 进 行 模 式 匹 配 操 作 不 同 , 用 户 可 以 指 定 一 个 非 常 复 杂 地 条 件 , 符 合 这 个 条 件 的 记 录 就 可 以 被 检 索 出 来 , 然 后 采 用 动 作 段 中 指 定 的 动 作 对 记 录进 行 相 应 的 操 作 。下 面 的 例 子 给 出 了 gawk 指 令 的 语 法 ,可 以 将 其 看 做 条 件 { 动作 }。

模 式 { 动 作 }

gawk 可 以 对 文 件 或 标 准 输 入 设 备 进 行 操 作 。 对 文 件 进 行 操 作 时 , 应 在 命 令行 上 的 指 令 后 列 出 文 件 名 , 如 果 没 有 列 出 文 件 名 , gawk 将 从 标 准 输 入 设 备 读 取输 入 。 下 面 的 例 子 给 出 了 gawk 命 令 的 完 整 结 构 。 调 用 时 在 命 令 行 上 输 入 gawk 关 键 字 和 相 应 的 gawk 指 令 即 可 , 与 sed 命 令 类 似 , 为 避 免 shell 对 gawk 指 令进 行 解 释 操 作 , 需 要 用 单 引 号 将 指 令 封 装 起 来 。 由 于 条 件 和 动 作 都 是 gawk 指令 的 一 部 分 , 因 此 它 们 应 该 使 用 同 一 对 引 号 。 下 面 的 例 子 给 出 了 gawk 命 令 的完 整 语 法 ( 参 见 表 26-1 )。

$ gawk ' 模 式 { 动作 }' 文 件 名

gawk 执 行 时 使 用 指 令 中 的 模 式 串 引 用 文 件 中 符 合 条 件 的 行 , 然 后 使 用 动 作段 中 的 动 作 对 这 些 行 进 行 处 理 。 不 过 , 动 作 和 模 式 都 有 自 己 缺 省 的 值 , 用 户 在使 用 这 些 缺 省 的 值 时 不 必 显 式 地 进 行 指 明 。 默 认 的 动 作 为 打 印 输 出 , 如 果 没 有指 定 动 作 , 将 对 选 定 的 行 进 行 打 印 输 出 。 默 认 的 模 式 为 选 择 文 本 中 的 每 一 行 , 因 此 , 如 果 没 有 指 明 模 式 , gawk 将 对 文 本 中 的 所 有 行 进 行 操 作 。 下 面 的 两 个 例子 都 可 以 打 印 输 出 含 有 模 式 串 "Penguin" 的 所 有 行 。 这 里 的 模 式 段 是 一 个 模 式 搜索 操 作 。 模 式 搜 索 操 作 由 两 个 斜 杠 中 的 模 式 表 示 。 所 有 符 合 这 个 模 式 的 文 本 行都 将 被 检 索 出 来 。 在 第 一 个 例 子 的 动 作 段 中 , 指 明 了 执 行 的 动 作 为 print 命 令 。

print 命 令 将 在 标 准 输 出 设 备 上 输 出 选 定 的 文 本 行 。 而 在 第 二 个 例 子 中 没 有 指 定动 作 段 , 因 此 gawk 程 序 将 执 行 默 认 的 动 作 , 即 print 命 令 。

books TempestShakespeare15. 75Penguin

ChristmasDickens3.50Academic

IliadHomer10.25Random RavenPoe2.50Penguin

$ gawk '/Penguin/{print}' books

TempestShakespeare15.75Penguin

Raven Poe 2.50Penguin

$gawk '/Penguin/' books

Tempest Shakespeare 15.75Penguin RavenPoe 2.50 Penguin

模 式 搜 索 和 特 殊 字 符

和 sed 应 用 程 序 相 同 , gawk 也 可 以 使 用 包 含 特 殊 字 符 的 模 式 搜 索 检 索 文 本中 的 各 行 。 模 式 串 由 开 始 和 结 尾 的 两 个 斜 杠 组 成 , 出 现 在 gawk 指 令 的 模 式 段 。

/模 式 / { 动 作 }

模 式 搜 索 操 作 将 对 文 件 中 的 所 有 行 进 行 。 如 果 在 某 行 上 找 到 指 定 的 模 式 , gawk 将 会 对 该 行 进 行 指 定 的 操 作 。 从 这 种 角 度 上 看 , gawk 与 编 辑 程 序 的 操 作很 相 似 。 与 sed 相 似 , gawk 中 的 行 也 被 看 作 是 一 行 文 本 , 匹 配 操 作 将 对 整 行进 行 。 在 下 面 的 例 子 中 , gawk 将 查 找 所 有 包 含 模 式 'Poe '的 行 , 然 后 输 出 该 行 。

$ gawk '/Poe/{print}' books RavenPoe2.50Penguin

在 gawk 中 可 以 使 用 sed 和 Ed 编 辑 器 的 正 则 表 达 式 中 可 用 的 所 有 特 殊 字

符 。 下 面 的 第 一 个 例 子 在 每 一 行 的 开 始 处 进 行 模 式 匹 配 , 特 殊 字 符 ^ 表 示 行 的 开始 。 第 二 个 例 子 则 在 每 一 行 的 末 尾 处 进 行 模 式 搜 索 。

$ gawk '/^Christmas/{print}' books

ChristmasDickens 3.50 Academic

$gawk 'Random$/{print}' books

Iliad Homer 10.25 Random

与 sed 和 Ed 相 同 , 可 以 在 模 式 中 使 用 特 殊 字 符 指 定 模 式 串 的 变 化 。 句 点 (.) 匹 配 任 何 字 符 , 星 号 (*) 匹 配 任 意 重 复 的 字 符 , 中 括 号 ([]) 则 对 指 定 的 字 符 集 进 行匹 配 。 在 下 面 的 例 子 中 , 句 点 用 来 匹 配 后 面 跟 有 字 符 串 "en" 的 任 意 字 符 。

$ gawk '/.en/{print}' books

ChristmasDickens 3.50 Academic

Raven Poe 2.50 Penguin

下 面 的 例 子 则 使 用 括 号 和 星 号 特 殊 字 符 指 定 一 个 数 字 序 列 。 [0-9 ]表 示 任 意的 数 字 字 符 , 这 里 的 星 号 表 示 对 任 意 重 复 的 数 字 进 行 匹 配 。 该 模 式 可 以 匹 配 任

何 以 .50 结 尾 的 数 字 串 。 注 意 这 里 的 句 点 前 有 一 个 反 斜 杠 , 表 示 这 里 的 句 点 为点 号 字 符 , 而 不 是 相 应 的 特 殊 字 符 。

$ gawk '/[0-9]*\.50/ {print}' books

Christmas

Dickens

3.50

Academic

Raven Poe

2.50

Penguin

在 gawk 中 还 可 以 使 用 扩 展 的 特 殊 字 符 : + 、 ? 和 |。 + 和 ? 是 特 殊 字 符 星 号

* 的 变 化 形 式 , + 可 以 匹 配 字 符 后 重 复 出 现 的 一 个 或 多 个 相 同 的 字 符 , ? 则 用 来匹 配 字 符 后 不 出 现 的 或 重 复 出 现 的 一 个 相 同 的 字 符 。 | 则 表 示 可 以 在 符 号 两 侧 的模 式 进 行 选 择 。 在 下 面 的 例 子 中 , 可 以 对 包 含 有 模 式 串 "penguin "或 "Academic" 的 行 进 行 匹 配 操 作 。

变 量 、 常 量 和 模 式

gawk 提 供 了 定 义 变 量 的 功 能 。 在 gw 中 存 在 三 种 变 量 : 域 变 量 、 特 殊 gawk 变 量 和 用 户 定 义 的 变 量 。 gawk 自 动 定 义 前 面 两 种 变 量 , 第 三 种 变 量 是 用 户 自 己定 义 的 。 在 gawk 中 还 可 以 定 义 算 术 和 字 符 串 常 量 。 算 术 常 量 由 数 字 构 成 , 而任 何 一 对 双 引 号 之 间 的 字 符 都 可 以 看 作 是 字 符 串 常 量 。

域 变 量 用 来 引 用 一 行 中 的 域 。 域 是 由 域 分 隔 符 分 隔 开 的 字 符 集 , 默 认 的 分隔 符 为 空 格 或 制 表 符 。同 其 他 数 据 库 filter 相 同 ,gawk 的 域 从 1 开 始 计 数 。gawk 为 文 件 中 的 每 一 个 域 都 会 定 义 一 个 域 变 量 。 域 变 量 由 美 圆 符 号 和 符 号 后 的 数 字组 成 , $2 表 示 第 二 个 域 。 变 量 $0 是 一 个 特 殊 的 域 变 量 , 它 包 含 了 一 行 中 所 有

的 内 容 。 域 变 量 可 以 用 在 gawk 指 令 的 模 式 段 或 动 作 段 中 。 如 果 同 时 列 出 多 个变 量 , 变 量 间 用 逗 号 加 以 分 隔 。 注 意 这 里 美 圆 符 号 $ 的 用 法 和 shell 程 序 中 的 用法 并 不 一 致 。 下 面 的 例 子 将 打 印 books 文 件 的 第 二 个 和 第 四 个 域 。 $2 和 $4 分别 引 用 这 两 个 域 。

books

Tempest Shakespeare 15.75 Penguin

Christmas

Dickens

3.50

Academic

Iliad

Homer

10.25

Random

Raven

Poe

2.50

Penguin

$ gawk '{print $2 $4}' books Shakespeare Penguin

D ickens Academic Homer Random

Poe Penguin

在 下 面 的 例 子 中 , 用 户 将 输 出 包 含 有 模 式 "Dickens" 的 行 两 次 , 第 一 次 逆 向输 出 各 域 , 第 二 次 则 采 用 正 向 输 出 。 这 里 使 用 $0 变 量 代 表 整 行 的 内 容 。

$ gawk '/Dickens/ {print $4, $3, $2, $1; print $0}' books Academic 3.50 Dickens Christmas Christmas Dickens 3.50 Academic

gawk 中 还 定 义 了 一 套 特 殊 变 量 用 来 提 供 当 前 处 理 文 档 的 信 息 。 NR 变 量 中

保 存 了 当 前 行 的 行 号 , NF 变 量 的 值 则 为 当 前 行 中 域 的 个 数 。 还 有 一 些 储 存 域 和

记 录 分 隔 符 的 其 他 变 量 。 gawk 中 甚 至 还 存 在 一 个 名 为 FILENAME 的 变 量 , 该变 量 储 存 了 当 前 正 在 处 理 的 文 件 名 。表 26-1 中 列 出 了 gawk 中 的 这 些 特 殊 变 量 。

特 殊 变 量 和 用 户 自 己 定 义 的 变 量 在 引 用 时 都 不 用 在 变 量 名 前 加 上 $ 符 号 。 下面 的 例 子 使 用 特 殊 变 量 NR 和 域 变 量 $2 、 $4 显 示 文 件 中 各 行 的 行 号 和 行 中 的 第

2 和 第 4 个 域 。 NR 变 量 中 储 存 了 正 在 处 理 的 行 的 行 号 。

$ gawk '{print NR, $2, $4}' books

1

Shakespeare

Penguin

2

Dickens

Academic

3

Homer

Random

4

Poe

Penguin

用 户 可 以 定 义 自 己 的 变 量 , 可 以 使 用 任 意 字 母 或 数 字 以 及 下 划 线 组 成 的 变量 名 。 变 量 名 必 须 以 字 母 开 头 。 在 第 一 次 使 用 变 量 时 , gawk 会 自 动 对 其 进 行 定义 。 变 量 的 类 型 不 需 事 先 声 明 , 而 有 变 量 使 用 的 方 式 来 决 定 。 如 果 使 用 变 量 储存 数 字 , 变 量 则 为 数 字 类 型 ; 如 果 使 用 变 量 储 存 字 符 , 则 变 量 为 字 符 串 类 型 。在 使 用 变 量 的 过 程 中 必 须 保 持 变 量 的 一 致 性 。 不 能 使 用 字 符 串 变 量 来 进 行 算 术操 作 , 反 之 亦 然 。

使 用 赋 值 操 作 符 , = , 可 以 对 变 量 进 行 赋 值 操 作 。 赋 值 运 算 符 的 左 边 为 变 量 , 右 边 为 需 要 给 变 量 赋 的 值 。 值 可 以 是 某 个 变 量 的 值 , 也 可 以 是 一 个 常 量 。 下 面的 例 子 将 第 二 个 域 变 量 的 内 容 赋 值 给 变 量 myfield 。

$ gawk '{myfield = $2; print myfield}' books Shakespeare

D ickens Homer Poe

模 式 搜 索 操 作 符

使 用 特 殊 操 作 符 ~ 和 !~ 可 以 在 域 中 进 行 模 式 搜 索 工 作 。 与 使 用 等 于 操 作 符 比较 字 符 串 和 整 个 域 不 同 , 使 用 ~ 操 作 符 可 以 在 查 看 域 中 是 否 存 在 指 定 的 模 式 。 在使 用 匹 配 操 作 符 时 , 操 作 符 的 左 边 是 被 搜 索 的 域 , 右 边 是 搜 索 使 用 的 模 式 。 下面 的 例 子 将 在 第 一 个 域 中 搜 索 模 式 "mas" 。

$ gawk '{$1 ~ /mas/} {print}' books

Christmas Dickens 3.50 Academic

下 面 的 例 子 则 将 显 示 第 一 个 域 中 不 包 含 模 式 "mas " 的 所 有 记 录 :

$ gawk '($1 !~ /mas/) {print}' books

Tempest

Shakespeare

15.75

Penguin

Iliad

Homer

10.25

Random

Raven

Poe

2.50

Penguin

和 一 般 的 模 式 搜 索 操 作 相 同 , 在 对 域 进 行 搜 索 时 也 可 以 使 用 特 殊 字 符 。 下面 的 例 子 将 对 第 四 个 域 中 "Penguin" 的 大 小 写 版 本 进 行 匹 配 。 特 殊 字 符 [] 用 来 定义 一 个 大 写 字 母 P 和 小 写 字 母 p 的 集 合 。

$ gawk '($4 ~ /[Pp]enguin/) {print}' books

Tempest

Shakespeare

15.75 Penguin

Raven

Poe

2.50 Penguin

BEGIN 和 END 模 式

gawk 中 存 在 两 个 BEGIN 和 END 这 两 个 特 殊 的 模 式 , 允 许 用 户 指 定 处 理 开始 前 和 对 输 入 行 处 理 完 毕 后 的 相 应 动 作 。 在 下 面 的 例 子 中 , 在 对 文 本 行 进 行 处理 前 将 输 出 表 头 , "Book List", 在 处 理 完 成 后 , 则 输 出 变 量 NR 的 值 。 在 进 行处 理 时 , 每 处 理 一 行 , NR 的 值 就 加 1 。 因 此 在 处 理 完 成 后 , NR 变 量 中 将 储 存文 件 中 的 记 录 总 个 数 。

$ gawk 'BEGIN {print "Book List"}--> {print} END {print "Total record is ", NR}' books

Book List

Tempest

Shakespeare

15.75

Penguin

Christmas

Dickens

3.50

Academic

Iliad

Homer

10.25

Random

Raven

Poe

2.50

Penguin

Total records is 4

gawk 指 令 文 件

由 于 gawk 指 令 变 得 越 来 越 复 杂 , 因 此 比 较 好 的 方 法 是 将 这 些 指 令 存 放 在 一个 gawk 指 令 文 件 中 , 然 后 使 用 gawk 读 出 该 文 件 并 执 行 。 如 果 需 要 改 变 执 行的 操 作 , 只 需 要 对 该 文 件 进 行 修 改 即 可 。 -f 选 项 表 示 从 gawk 指 令 文 件 而 不 是命 令 行 上 读 入 gawk 指 令 。 在 下 面 的 例 子 中 , 列 出 Penguin 出 版 的 书 的 指 令 存放 在 名 为 findbk 的 gawk 指 令 文 件 中 。执 行 这 些 指 令 时 需 要 在 命 令 行 上 输 入 gawk 命 令 , 并 带 上 -f 选 项 和 findbk 文 件 名 。

findbk

BEGIN {print "Book List"; count = 1;

}

/$4 ~ "Penguin"/ { count = count = 1; print;

}

END {

print "Total records found is ", count

}

$ gawk -f findbk books

Book List TempestShakespeare15.75Penguin RavenPoe2.50Penguin

Total records found is 2

注 意 在 这 里 不 需 要 在 指 令 前 后 加 上 单 引 号 。 在 指 令 文 件 中 可 以 将 指 令 的 不同 部 分 放 在 不 同 的 行 上 , 增 强 指 令 的 可 读 性 , 这 一 点 对 控 制 结 构 的 使 用 非 常 有用 。

26.3.1 控 制 结 构

gawk 与 编 程 语 言 非 常 类 似 , 可 以 在 gawk 中 定 义 变 量 、 创 建 表 达 式 或 进 行赋 值 操 作 。在 gawk 中 还 包 含 了 一 套 控 制 结 构 可 以 完 成 迭 代 和 选 择 功 能 。在 gawk 中 存 在 3 种 循 环 控 制 结 构 : while, for 和 for-in 循 环 。 另 外 , 还 存 在 一 种 选 择 控制 结 构 :if 选 择 语 句 。 表 26-1 中 列 出 了 gawk 中 的 控 制 结 构 。 除 了 for-in 循 环 外 , 这 些 控 制 结 构 和 C 语 言 中 的 相 应 结 构 非 常 类 似 。 在 gawk 中 也 存 在 一 些 用 于 读入 和 输 出 数 据 的 命 令 。 表 26-1 中 列 出 了 这 些 命 令 。

作 为 用 户 定 义 F ilter 的 gawk

将 整 个 gawk 指 令 放 在 一 个 脚 本 文 件 中 ,就 可 以 使 用 gawk 定 义 自 己 的 filter。

可 以 将 改 脚 本 文 件 设 为 可 执 行 文 件 , 这 样 该 文 件 的 文 件 名 就 成 为 了 一 个 新 的LINUX 命 令 。 在 这 个 脚 本 文 件 中 , 必 须 在 指 令 的 前 后 加 上 单 引 号 。 脚 本 文 件 中的 内 容 必 须 能 够 在 shell 上 直 接 执 行 , 因 此 在 书 写 脚 本 文 件 时 必 须 严 格 按 照 在 命令 行 上 书 写 gawk 指 令 的 格 式 来 进 行 书 写 。 在 脚 本 文 件 中 , 可 以 将 指 令 的 模 式段 和 动 作 段 写 在 不 同 的 行 上 , 但 所 有 的 回 车 换 行 符 必 须 都 包 含 在 指 令 前 后 的 两个 单 引 号 之 间 。 也 就 是 说 , 脚 本 文 件 的 第 一 行 必 须 是 关 键 字 gawk 和 一 个 单 引号 , 然 后 可 以 任 意 在 不 同 的 行 上 书 写 相 应 的 模 式 和 动 作 。 但 文 件 的 末 尾 必 须 也是 一 个 单 引 号 , 然 后 在 同 一 行 上 输 入 所 需 的 文 件 名 参 数 。 这 种 格 式 的 语 法 为 :

gawk '

模 式 { gawk 动 作 ;

} ' 文 件 名

在 下 面 的 例 子 中 , 用 户 将 整 个 gawk 指 令 存 放 在 一 个 名 为 field3 的 脚 本 文 件中 。 该 指 令 将 输 出 每 一 行 的 前 三 个 域 。 注 意 , 这 里 的 gawk 指 令 前 后 都 存 在 单引 号 。 在 使 用 chmod 命 令 给 改 文 件 赋 予 可 执 行 属 性 后 , 就 可 以 简 单 地 输 入 脚 本文 件 名 来 执 行 该 文 件 。

field3 gawk '{

for (i = 1; (i <=3); i + + )

{

printf("%s\t", $i);

}

printf("\n");

} 'books'

$ chmod 755 field3

$ field3 TempestShakespeare15.75 ChristmasDickens3.50 IliadHomer10.25 RavenPoe2.50

表 26-1gawk 选 项 、 操 作 符 、 变 量 和 控 制 结 构

组 件

-f 文 件 名

件 中 读 入 gawk 指 令

-Fc

指符

定或

输空

入格

文 件 的 域 分 隔 符 。 默 认 的 分 隔 符 为

$ gawk -F: books

输 出 操 作

print

出 设 备 上 输 出 当 前 行 的 内 容

print 变 量 名

出 设 备 上 输 出 变 量

print 变 量 名 >>

文 件 名

值 输 出 到 文 件

输 入 操 作

getline 变 量 名

行 输 入 。如 果 已 经 到 达 文 件 末 尾 ,返

了 变 量 , 将 读 入 的 值 赋 给 该 变 量

0 。

getline 变 量 名名

<< 文 件

件给

末该

尾变

, 量

件 中 读 入 下 一 行 输 入 。 如 果 已 经 到返 回 0 。 如 果 指 定 了 变 量 , 将 读 入 的

达值

文赋

控 制 结 构

{ 动 作 }

语 句 组 和 前 后 的 花 括 号 组 成

if ( 表 达 式 ) 动 作 1

else 动 作 2

如 果 表 达 式 为 真 , if 控 制 结 构 将 执 行 语 句 1 。 如 果

表 达 式 为 假 , 将 执 行 语 句 2

续 表

while ( 表 达 式 ) 动作

如指

果定

表 达 式 为 真 , while

的 动 作

循 环 将 反 复 执

for ( 表 达 式 1 ; 表 达 式 2 ; 表 达 式 3 ) 动 作

如指达

果定式

表 达 式 2 为 真 , for 循 环 将 反 复 执的 动 作 。 表 达 式 1 将 在 循 环 开 始

3 则 在 每 次 迭 代 过 程 结 束 后 执 行

行前

循执

环行

的表

for ( 变 量

in

数 组 名 )

for-in 控 制 结 构 是 为 关 联 数 组 设 计

引 串 将 将 依 次 赋 值 给 指 定 变 量

next

next

个 记

命 令 停 止 对 当 前 记 录 的 操 作 , 直

exit

exit

命 令

命 令 停 止 所 有 对 记

( 如 果 有 )

录 的 操 作 , 直 接

END

操 作 符

>

<

>=

或 等 于

<=

或 等 于

==

!=

&&

||

续 表

!

逻 辑 非

字 符 串 ~ 正 则 表 达 式

在 字 符 串 中 搜 索 指 定 的 正 则 表 达 式

字 符 串 !~ 正 则 表 达 式

查 看 在 字 符 串 中 是 否 不 存 在 指 定 的 正 则 表 达 式

初 始 化 和 中 止 模 式

BEGIN

在 gawk 开 始 处 理 前 执 行 的 操 作

END

在 gawk 结 束 处 理 后 执 行 的 操 作

变 量

NR

当 前 行 的 记 录 号

NF

当 前 记 录 中 域 的 个 数

$0

整 个 当 前 记 录

$n

当 前 记 录 中 的 域 , 从 1 开 始 计 数 , 如 $1

FS

输 入 的 域 分 隔 符 , 默 认 的 分 隔 符 为 空 格 或 制 表 符