第 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 变 量 名 >> |
文 件 名 | 将 |
变 |
量 |
的 |
值 输 出 到 文 件 |
||
输 入 操 作 |
||||||||
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 |
输 入 的 域 分 隔 符 , 默 认 的 分 隔 符 为 空 格 或 制 表 符 |