第 14 章 过 滤 器 与 正 则 表 达 式

Unix 系 统 的 一 个 非 常 突 出 的 特 性 是 其 过 滤 器 命 令 , 而 Linux 系 统 也 具 有 这一 特 性 。 过 滤 器 是 一 些 读 取 数 据 的 命 令 , 并 能 对 这 些 读 取 的 数 据 执 行 适 当 的 操作 , 然 后 把 操 作 的 结 果 送 到 标 准 输 出 。 这 些 过 滤 器 根 据 不 同 的 任 务 可 输 出 不 同的 结 果 。 一 些 过 滤 器 输 出 一 些 输 入 信 息 , 而 有 一 些 过 滤 器 仅 输 出 输 入 信 息 的 部分 内 容 , 还 有 一 些 过 滤 器 把 输 入 的 信 息 进 行 修 改 , 尔 后 再 进 行 必 要 的 输 出 。 但有 些 过 滤 器 有 不 同 的 选 项 , 根 据 不 同 的 选 项 , 你 可 以 进 行 部 分 或 全 部 输 入 信 息的 输 出 , 或 进 行 必 要 的 修 改 后 再 输 出 。 你 可 以 认 为 过 滤 器 就 是 读 取 数 据 流 , 并对 读 取 的 数 据 流 进 行 必 要 的 修 改 操 作 , 最 后 输 出 这 些 修 改 后 的 数 据 流 。

输 入 至 过 滤 器 的 数 据 流 可 以 是 一 系 列 的 输 入 数 据 , 包 括 从 文 件 、 设 备 及 命令 或 其 它 过 滤 器 命 令 的 输 出 等 。 过 滤 器 仅 仅 对 输 入 的 数 据 流 进 行 操 作 , 它 并 不修 改 原 数 据 。 如 果 过 滤 器 从 文 件 中 接 收 数 据 , 其 原 文 件 是 不 会 被 修 改 的 , 因 为过 滤 器 只 是 从 文 件 中 读 取 数 据 。

过 滤 器 的 输 出 经 常 被 输 出 到 标 准 输 出 , 也 可 以 被 重 定 向 到 另 外 一 个 文 件 中或 设 备 上 , 或 者 用 管 道 输 入 给 另 外 一 个 实 用 程 序 或 过 滤 器 。 所 有 管 道 与 重 定 向的 特 性 同 样 适 用 于 过 滤 器 。 通 常 过 滤 器 读 取 数 据 , 进 行 必 要 的 修 改 , 然 后 通 过管 道 输 入 至 另 外 一 个 过 滤 器 。 但 是 , 请 注 意 : 输 入 的 原 文 件 数 据 是 不 会 被 修 改的 , 这 一 点 非 常 重 要 。

许 多 实 用 程 序 与 过 滤 器 使 用 模 式 ( pattern ) 来 在 文 件 中 定 位 、 选 择 指 定 的文 本 。 但 有 时 候 , 你 必 须 使 用 方 式 更 灵 活 、 功 能 更 强 大 的 模 式 来 在 文 件 中 同 时

搜 索 不 同 的 字 符 或 字 符 串 。 此 时 , 你 可 以 在 模 式 中 使 用 一 组 特 殊 的 字 符 来 完 成这 一 方 式 灵 活 、 功 能 强 大 的 搜 索 。 如 果 一 个 模 式 中 包 含 一 些 特 殊 字 符 , 这 我 们称 该 模 式 为 正 则 表 达 式 。 大 多 数 模 式 及 实 用 程 序 都 可 以 使 用 正 则 表 达 式 来 进 行模 式 搜 索 , 例 如 egrp 、 grep、 awk 、 Ed 及 sed 等 。 尽 管 在 正 则 表 达 式 中 的 许 多特 殊 字 符 与 在 Shell 下 的 特 殊 字 符 相 同 , 但 它 们 的 使 用 方 式 、 代 表 的 意 义 有 所不 同 。 Shell 命 令 下 的 特 殊 字 符 主 要 用 在 文 件 名 中 , 而 正 则 表 达 式 主 要 用 来 搜 索文 本 。

本 书 把 过 滤 器 分 为 常 见 的 三 类 : 文 件 过 滤 器 、 编 辑 过 滤 器 及 数 据 过 滤 器 。本 章 将 主 要 介 绍 文 件 及 编 辑 过 滤 器 。 大 多 数 有 关 Unix 系 统 的 参 考 书 上 都 介 绍 过数 据 过 滤 器 。 本 章 的 附 表 部 分 详 细 列 出 了 所 有 的 过 滤 器 , 包 括 数 据 过 滤 器 。 本章 将 首 先 向 你 介 绍 怎 样 在 过 滤 器 中 使 用 重 定 向 及 管 道 , 并 比 较 过 滤 器 中 使 用 重定 向 及 管 道 产 生 的 各 种 不 同 的 输 出 , 然 后 详 细 介 绍 编 辑 过 滤 器 及 正 则 表 达 式 。

在 过 滤 器 中 使 用 重 定 向 及 管 道 : ca t, tee , head 及 tail 命

过 滤 器 可 以 把 它 们 的 输 出 送 到 标 准 输 出 上 , 其 缺 省 的 标 准 输 出 是 显 示 屏 。一 个 最 简 单 的 过 滤 器 是 输 出 文 件 的 内 容 。 本 书 已 经 向 你 介 绍 了 cat 及 tee 命 令 , 你 可 能 没 意 识 到 的 是 : cat 及 tee 命 令 就 是 过 滤 器 实 用 命 令 。它 们 接 收 多 行 数 据 , 并 把 它 们 输 出 至 屏 幕 。 cat 过 滤 器 命 令 接 收 来 自 文 件 的 输 入 , 并 把 接 收 的 数 据 拷贝 到 标 准 输 出 上 , 缺 省 的 标 准 输 出 就 是 屏 幕 。 过 滤 器 tee 命 令 接 收 输 入 的 数 据 ,

并 把 它 们 同 时 输 出 到 标 准 输 出 及 指 定 的 文 件 。 除 了 cat 命 令 及 tee 命 令 以 外 , 还 有 另 外 两 个 过 滤 器 命 令 用 来 输 出 文 件 : head 及 tail 命 令 。 head 过 滤 器 命 令输 出 文 件 的 首 部 , 而 tail 过 滤 器 命 令 输 出 文 件 的 尾 部 。

你 可 以 保 存 过 滤 器 的 输 出 至 文 件 或 输 出 至 打 印 机 。 你 可 以 使 用 重 定 向 或 管道 操 作 来 达 到 上 述 目 的 。 如 果 要 把 过 滤 器 的 输 出 保 存 到 文 件 中 , 你 可 以 使 用 重定 向 操 作 符 “ > ” ; 如 果 你 想 把 重 定 向 的 输 出 输 出 至 打 印 机 , 你 可 以 使 用 管 道 来把 它 输 出 至 lpr 实 用 程 序 ( lpr 实 用 用 来 打 印 文 件 ) 。 在 下 面 的 命 令 中 , cat 命 令用 管 道 将 其 输 出 的 结 果 输 出 到 lpr 命 令 , 然 后 , lpr 命 令 将 它 在 打 印 机 上 输 出 。

$ cat complist | lpr

另 外 一 些 用 来 显 示 文 件 的 命 令 如 more 命 令 , 看 起 来 似 乎 是 一 个 过 滤 器 命令 , 而 实 际 上 不 是 。 你 必 须 注 意 过 滤 器 命 令 与 面 向 设 备 ( device oriented ) 的实 用 命 令 之 间 的 区 别 , 例 如 lpr 命 令 与 more 命 令 之 间 的 区 别 。 过 滤 器 命 令 是 把它 们 的 输 出 结 果 输 出 到 标 准 输 出 上 , 而 面 向 ( device oriented ) 的 实 用 命 令 例如 lpr 命 令 , 尽 管 可 以 从 标 准 输 入 设 备 上 接 收 数 据 的 输 入 , 但 它 们 只 能 把 数 据 输出 到 标 准 输 出 设 备 上 , more 命 令 也 是 如 此 , 只 不 过 其 输 出 设 备 是 终 端 。 这 些 面向 设 备 ( device oriented ) 的 实 用 命 令 也 可 以 接 收 来 自 过 滤 器 命 令 的 输 入 , 但它 们 仅 能 将 它 们 输 出 至 设 备 。

所 有 的 过 滤 器 命 令 都 可 以 接 收 来 自 标 准 输 入 的 数 据 输 入 。 事 实 上 , 通 过 管道 , 你 也 可 以 把 过 滤 器 的 输 出 作 为 另 一 个 过 滤 器 的 输 入 。 此 外 , 也 有 许 多 过 滤器 可 以 直 接 接 收 来 自 文 件 的 输 入 , 这 些 过 滤 器 可 以 用 文 件 名 作 为 它 们 的 参 数 , 并 直 接 从 这 些 文 件 中 读 取 数 据 。 例 如 过 滤 器 命 令 cat 及 过 滤 器 命 令 sort 就 是 如此 , 它 们 或 者 使 用 文 件 名 参 数 来 直 接 从 文 件 中 读 取 数 据 , 或 者 从 标 准 输 入 上 读

取 数 据 。

如 果 你 在 使 用 cat 命 令 的 时 候 没 有 指 定 文 件 名 , 那 么 , cat 命 令 将 从 标 准 输入 上 读 取 数 据 。 此 时 , cat 命 令 将 等 待 你 从 键 盘 上 输 入 数 据 , 并 把 你 键 入 的 数 据作 为 其 输 入 。 你 可 以 使 用 CTRL-D 命 令 ( 文 件 结 束 字 符 ) 来 结 束 你 的 本 次 标 准输 入 。在 下 面 的 例 子 中 ,cat 命 令 从 标 准 输 入 上 读 取 数 据( 此 时 标 准 输 入 是 键 盘 ), 并 用 重 定 向 把 标 准 输 入 输 出 到 名 为 mydata 的 文 件 中 去 。

$ cat > mydata Hello Marylou How are you

today

^D

$

cat 命 令 的 一 个 更 强 的 特 性 与 功 能 是 它 能 把 几 个 文 件 的 内 容 合 并 到 输 出 流 。你 可 以 用 管 道 把 这 一 输 出 流 输 入 到 一 个 实 用 程 序 , 甚 至 另 一 个 过 滤 器 , 并 允 许实 用 程 序 或 过 滤 器 把 这 些 文 件 合 并 后 的 内 容 作 为 一 个 数 据 流 进 行 操 作 。 例 如 , 如 果 你 想 一 次 逐 屏 浏 览 多 个 文 件 的 内 容 , 可 以 首 先 用 cat 过 滤 器 命 令 把 多 个 文件 合 并 , 然 后 用 管 道 把 合 并 后 的 数 据 输 入 到 more 过 滤 器 命 令 上 , more 命 令 将从 标 准 输 入 上 接 收 这 些 数 据 的 输 入 。 对 于 下 面 的 一 组 命 令 , cat 过 滤 器 命 令 将 把文 件 preface 及 intro 的 内 容 拷 贝 至 一 个 输 出 中 。 第 一 个 例 子 是 用 管 道 把 合 并 后的 输 出 输 入 到 more 命 令 , 于 是 , 你 可 以 逐 屏 浏 览 合 并 后 的 文 本 。 第 二 个 例 子是 用 管 道 把 合 并 后 的 输 出 输 入 到 打 印 机 。 第 三 个 命 令 是 用 重 定 向 把 合 并 后 的 输出 保 存 到 名 为 frontdata 的 文 件 中 。

$ cat preface intro | more

$ cat preface intro | lpr

$ cat preface intro > frontdata

过 滤 器 可 以 接 收 来 自 管 道 的 输 入 , 也 可 以 把 它 们 的 输 出 数 据 输 入 至 管 道 。同 时 , 你 也 可 以 用 管 道 把 过 滤 器 或 实 用 程 序 的 输 出 数 据 输 入 到 过 滤 器 , 而 此 过滤 器 的 输 出 数 据 又 可 以 用 管 道 输 出 至 另 一 过 滤 器 。 你 甚 至 可 以 用 一 系 列 的 过 滤器 命 令 把 前 一 个 过 滤 器 的 输 出 数 据 作 为 下 一 个 过 滤 器 的 输 入 。 例 如 , 你 可 以 用管 道 操 作 把 cat 过 滤 器 的 输 出 数 据 作 为 另 一 个 过 滤 器 的 输 入 。 必 须 注 意 , 此 时过 滤 器 将 通 过 管 道 操 作 来 接 收 标 准 输 入 的 输 入 , 而 不 是 从 文 件 。 例 如 , 假 设 你想 打 印 cat 命 令 的 输 出 , 同 时 你 又 想 把 其 输 出 保 存 到 另 一 个 文 件 , 这 时 , 你 可以 首 先 用 tee 过 滤 器 命 令 将 其 输 出 保 存 到 一 个 文 件 , 然 后 用 管 道 命 令 把 其 输 出数 据 输 出 至 lpr 命 令 实 用 程 序 , 以 打 印 出 该 文 件 。 tee 命 令 是 一 个 过 滤 器 命 令 , 该 命 令 把 标 准 输 入 拷 贝 到 一 个 文 件 中 , 同 时 把 它 这 一 标 准 输 入 输 出 至 标 准 输 出上 。 必 须 注 意 , 通 过 管 道 操 作 , 命 令 tee 接 收 来 至 过 滤 器 命 令 cat 的 输 出 。 在下 面 的 例 子 中 , tee 过 滤 器 命 令 首 先 把 cat 命 令 的 输 出 保 存 到 文 件 frontcopy 中 , 然 后 通 过 管 道 把 它 输 出 到 lpr 实 用 程 序 上 , 从 而 打 印 出 该 文 件 。

$ cat preface intro | tee frontcopy | lpr

14.1.1 输 出 文 件 的 头 部 与 尾 部 命 令 : head 及 tail 命 令

假 设 , 如 果 你 只 想 查 看 一 个 文 件 究 竟 保 存 的 是 什 么 内 容 。 为 此 , 你 可 以 只查 看 文 件 的 头 几 行 , 而 不 必 浏 览 整 个 文 件 。 过 滤 器 命 令 head 可 以 达 到 上 述 目的 。 head 命 令 可 以 只 显 示 文 件 或 标 准 输 入 的 头 几 行 。 与 许 多 其 它 过 滤 器 命 令 一样 , head 过 滤 器 有 各 种 选 项 , 通 过 这 些 选 项 , 你 可 以 控 制 文 件 或 标 准 输 入 的 输

出 。 缺 省 情 况 下 , head 过 滤 器 仅 显 示 文 件 的 头 十 行 。 你 可 以 通 过 选 项 ( 在 破 折号 后 面 跟 一 个 数 字 ) 在 命 令 行 上 指 定 你 将 要 显 示 的 行 数 。 在 下 面 的 例 子 中 , 首先 用 cat 命 令 输 出 preface 文 件 的 所 有 内 容 , 然 后 用 head 命 令 显 示 preface 文件 的 头 三 行 。

$ cat preface

a text file in Unix consists of a stream of characters. An editor can be used to create such text files, changing or adding to the character data in the file.

$ head -3 preface a text file in Unix

consists of a stream of characters. An editor can

同 样 , 如 果 你 只 想 查 看 文 件 的 尾 部 , 你 可 以 使 用 另 一 个 过 滤 器 命 令 tail 。 缺省 情 况 下 , tail 命 令 显 示 文 件 的 最 后 十 行 。 与 在 head 过 滤 器 命 令 一 样 , 你 可 以在 破 折 号 后 面 指 定 你 想 显 示 的 行 数 。 在 下 面 的 例 子 中 , preface 文 件 的 最 后 三 行被 显 示 在 屏 幕 上 。

$ tail -3 preface

text files, changing or adding to the character

data in the file.

过 滤 器 命 令 tail 首 先 读 取 数 据 , 然 后 输 出 其 “ 过 滤 ” 后 的 数 据 。 对 于 tail 命令 是 数 据 的 最 后 几 行 。 与 cat 命 令 一 样 , 你 可 以 通 过 管 道 操 作 把 tail 及 head 命令 输 出 至 打 印 机 或 者 用 重 定 向 操 作 输 出 至 另 一 文 件 。 在 下 面 的 例 子 中 , tail 过 滤器 通 过 管 道 操 作 把 preface 文 件 的 最 后 五 行 输 出 至 打 印 机 。

$ tail -5 preface | lpr

输 出 类 过 滤 器 : w c , spell 及 sort

过 滤 器 命 令 的 输 出 可 以 是 经 过 修 改 后 的 输 入 数 据 的 拷 贝 , 或 者 是 输 入 数 据的 一 部 分 , 甚 至 是 输 入 数 据 的 一 些 简 单 信 息 。 有 些 过 滤 器 命 令 的 输 出 可 能 是 上述 的 一 种 , 而 有 些 过 滤 器 命 令 可 以 通 过 选 项 来 指 定 其 输 出 。 wc 命 令 、 spell 命令 及 sort 命 令 可 以 用 来 说 明 上 述 三 种 不 同 的 输 出 。 过 滤 器 命 令 wc 仅 显 示 出 文件 的 行 数 、 单 词 数 及 字 符 数 , 过 滤 器 命 令 spell 仅 选 择 那 些 有 拼 写 错 误 的 单 词 , 然 后 把 它 们 输 出 。 过 滤 器 命 令 sort 将 按 顺 序 输 出 所 有 的 输 入 数 据 。 这 三 个 过 滤器 命 令 及 它 们 的 常 用 选 项 在 表 14-1 中 列 出 。

计 数 命 令 : wc 命 令

过 滤 器 命 令 wc 把 它 的 输 入 数 据 看 作 数 据 流 ( 这 些 数 据 通 常 是 来 自 于 读 取 的文 件 ) , 然 后 该 命 令 统 计 文 件 中 的 行 数 、 单 词 数 及 字 符 数 ( 包 括 行 尾 的 换 行 字符 ) , 并 把 它 统 计 的 结 果 输 出 。 在 下 面 的 例 子 中 , wc 命 令 统 计 并 输 出 了 preface

文 件 中 的 行 数 、 单 词 数 及 字 符 数 。

$ wc preface

6 27 142 preface

wc 命 令 有 三 个 选 项 , 这 些 选 项 可 以 用 来 输 出 任 意 一 个 指 定 的 统 计 数 字 , 如行 号 、 单 词 数 或 字 符 数 , 其 中 , -w 选 项 仅 统 计 文 件 中 的 单 词 数 , -c 选 项 仅 统 计文 件 中 的 字 符 数 , 而 -l 选 项 仅 统 计 文 件 中 的 行 数 。

拼 写 检 查 命 令 : spell 命 令

过 滤 器 命 令 spell 将 检 查 其 输 入 数 据 中 的 拼 写 错 误 , 并 同 时 输 出 这 些 拼 写 出错 的 单 词 。

$ spell foodlistsp soop

vegetebels

通 过 重 定 向 操 作 , 你 可 以 把 这 些 拼 写 出 错 的 单 词 保 存 到 指 定 的 文 件 中 去 , 而 通 过 管 道 操 作 , 你 可 以 打 印 出 这 些 出 错 的 单 词 。 在 下 面 的 例 子 中 , 用 户 把 拼写 出 错 的 单 词 保 存 到 名 为 m isspell 的 文 件 中 。

$ spell foodlistsp > misspell

记 住 , 你 可 以 通 过 管 道 操 作 把 一 个 过 滤 器 命 令 的 输 出 数 据 输 入 到 另 一 个 过滤 器 命 令 。 例 如 , 如 果 你 仅 想 知 道 一 个 文 件 中 究 竟 出 现 了 多 少 次 拼 写 错 误 , 你可 以 通 过 管 道 把 过 滤 器 命 令 spell 的 输 出 数 据 输 入 到 过 滤 器 命 令 wc 来 统 计 文 件中 的 拼 写 错 误 。 在 下 面 的 例 子 中 , 文 件 foodlistsp 的 拼 写 错 误 被 输 出 , 而 该 列出 的 拼 写 错 误 通 过 管 道 操 作 输 入 给 过 滤 器 命 令 wc , 最 后 , 用 带 -w 选 项 的 wc 命令 统 计 并 输 出 出 错 的 单 词 数 。

$ spell foodlistsp | wc -w 2

文 件 排 序 命 令 : sort 命 令

过 滤 器 sort 命 令 将 对 文 件 中 的 各 行 进 行 排 序 。 sort 命 令 有 许 多 非 常 实 用 的选 项 , 这 些 选 项 最 初 是 用 来 对 数 据 库 格 式 文 件 的 内 容 进 行 各 种 排 序 操 作 的 。 实际 上 , sort 命 令 可 以 被 认 为 是 一 个 非 常 强 大 的 数 据 管 理 工 具 , 用 来 管 理 有 类 似于 数 据 库 文 件 记 录 的 文 件 。 本 小 节 将 介 绍 怎 样 使 用 sort 命 令 把 文 件 中 的 文 本 行按 字 母 顺 序 进 行 排 序 。

过 滤 器 命 令 sort 将 逐 行 对 文 件 中 的 内 容 进 行 排 序 , 如 果 两 行 的 首 字 符 相 同 , 该 命 令 将 继 续 比 较 这 两 行 的 下 一 字 符 , 如 果 还 相 同 , 将 继 续 进 行 比 较 。 在 下 面的 例 子 中 , 过 滤 器 命 令 sort 将 输 出 foodlist 文 件 中 文 本 行 排 序 后 的 结 果 。 请 注意 , 在 原 文 件 的 第 二 、 三 行 上 的 第 一 个 单 词 完 全 相 同 , 该 命 令 将 从 它 们 的 第 二个 单 词 vegetables 与 fruit 的 首 字 符 处 继 续 进 行 比 较 。

$ cat foodlist vegetable soup fresh vegetables fresh fruit

lowfat milk

$ sort foodlist fresh fruit

fresh vegetables

lowfat milk vegetable soup

当 然 , 你 可 以 保 存 排 序 后 的 文 件 内 容 , 或 这 把 排 序 后 的 文 件 内 容 输 出 至 打印 机 。 在 下 面 的 例 子 中 , 用 户 把 排 序 后 的 文 件 内 容 保 存 到 名 为 slist 的 文 件 中 。

$ sort foodlist > slist

过 滤 器 命 令 也 可 以 对 标 准 输 入 进 行 操 作 。 例 如 , 如 果 你 想 把 几 个 文 件 文 本行 合 并 , 并 对 合 并 后 的 文 本 行 进 行 排 序 , 你 可 以 首 先 用 过 滤 器 命 令 cat 把 多 个文 件 合 并 , 然 后 用 管 道 操 作 把 合 并 后 的 文 本 行 输 入 给 过 滤 器 命 令 sort , sort 命令 将 输 出 这 些 合 并 及 排 序 后 的 文 本 行 。 在 下 面 的 例 子 中 , 文 件 veglist 与 文 件fruitlist 的 文 本 行 经 过 合 并 与 排 序 后 被 保 存 到 文 件 clist 中 。

$ cat veglist fruitlist | sort > clist

搜 索 文 件 命 令 : grep 命 令 与 fgrep 命 令

过 滤 器 命 令 grep 与 fgrep 用 来 搜 索 与 文 件 中 的 字 符 串 相 匹 配 的 模 式 , 然 后它 通 知 用 户 在 什 么 文 件 中 搜 索 到 与 指 定 的 模 式 匹 配 的 字 符 串 , 并 打 印 出 所 有 包含 该 字 符 串 的 文 本 行 , 在 该 文 本 行 的 最 前 面 是 该 行 所 在 的 文 件 名 。 grep 命 令 一次 只 能 搜 索 一 个 指 定 的 模 式 , 而 fgrep 命 令 却 可 以 一 次 搜 索 多 个 模 式 。 过 滤 器命 令 grep 与 fgrep 的 使 用 及 其 选 项 见 附 表 14-1 。

过 滤 器 命 令 grep 与 fgrep 搜 索 与 定 位 文 件 中 特 定 的 主 题 是 非 常 有 用 。 要 搜索 的 模 式 可 以 被 认 为 是 一 些 关 键 词 , 你 可 以 用 它 们 来 搜 索 文 件 中 包 含 的 这 些 关键 词 。 对 于 grep 命 令 , 它 的 搜 索 功 能 比 fgrep 要 强 大 , 因 为 grep 命 令 的 搜 索

模 式 可 以 是 正 则 表 达 式 , 而 fgrep 却 不 能 。 有 关 正 则 表 达 式 ( 在 Ed 行 编 辑 器 中常 使 用 正 则 表 达 式 ) , 本 章 的 后 半 部 分 将 给 予 介 绍 。

grep 命 令

过 滤 器 命 令 grep 有 两 个 参 数 , 其 中 , 第 一 个 参 数 是 要 搜 索 的 模 式 , 而 第 二个 参 数 是 要 搜 索 的 文 件 名 列 表 。 其 用 法 如 下 : 在 命 令 行 的 命 令 后 键 入 搜 索 的 模式 , 再 键 入 要 搜 索 的 文 件 。 其 中 , 文 件 名 列 表 中 也 可 以 使 用 特 殊 字 符 , 如 星 号“ *” 等 , 以 用 来 生 成 文 件 名 列 表 。

$ grep pattern filenames-list

在 下 面 的 例 子 中 , grep 命 令 搜 索 preface 文 件 中 包 含 模 式 “ stream ” 的 文本 行 。

$ grep stream preface consists of a stream of

如 果 你 想 在 搜 索 的 模 式 中 包 含 多 个 单 词 , 你 可 以 用 单 引 号 把 要 搜 索 的 模 式括 起 来 , 以 用 来 表 明 搜 索 的 模 式 是 由 包 含 空 格 的 多 个 单 词 组 成 。 否 则 , Shell 将把 空 格 认 为 是 命 令 行 参 数 的 定 界 符 , 而 grep 命 令 将 把 搜 索 模 式 中 的 单 词 解 释 为文 件 名 列 表 中 的 一 部 分 。 在 下 面 的 例 子 中 , grep 命 令 用 来 搜 索 模 式“ text file ” 。

$ gep 'text file' preface A text file in Unix

text files, changing or

如 果 你 在 文 件 名 列 表 中 使 用 了 多 个 文 件 , grep 命 令 将 在 匹 配 的 文 本 行 之 前输 出 相 应 的 文 件 名 。 在 下 面 的 例 子 中 , grep 命 令 搜 索 文 件 preface 及 intro 中 的模 式 “ data ” , 在 输 出 每 个 匹 配 的 文 本 行 之 前 , 列 出 了 其 对 应 的 文 件 名 。

$ grep data preface intro preface: data in the file. intro: new data

前 面 已 经 提 到 过 , 你 可 以 在 命 令 行 上 用 Shell 特 殊 字 符 来 生 成 将 要 搜 索 的 文件 名 列 表 。 在 下 面 的 例 子 中 , 特 殊 字 符 星 号 “ * ” 用 来 生 成 一 个 文 件 名 列 表 , 该列 表 包 含 当 前 命 令 下 所 有 的 文 件 。 该 命 令 将 非 常 简 单 方 便 地 搜 索 出 当 前 目 录 下所 有 文 件 中 包 含 与 模 式 匹 配 的 字 符 串 。

$ grep data *

特 殊 字 符 在 搜 索 一 组 指 定 的 文 件 是 非 常 有 用 。 例 如 , 如 果 你 想 搜 索 所 有 的C 程 序 源 文 件 中 特 定 的 模 式 , 你 可 以 用 “ *.c” 来 指 定 文 件 名 列 表 。 假 设 你 的 C 程 序 中 包 含 一 个 不 必 要 的 循 环 语 句 ( 如 while 语 句 ) , 并 要 找 到 这 些 语 句 , 你可 以 用 如 下 的 命 令 来 搜 索 并 显 示 所 有 包 含 while 语 句 的 代 码 行 :

$ grep while *.c

过 滤 器 命 令 grep 也 有 一 组 选 项 , 这 些 选 项 可 以 改 变 其 输 出 方 式 。 例 如 , 你可 以 在 搜 索 到 的 文 本 行 上 加 入 行 号 , 或 者 只 输 出 文 本 行 的 行 号 , 或 者 输 出 所 有与 搜 索 模 式 不 匹 配 的 文 本 行 , 或 只 简 单 地 输 出 已 搜 索 到 指 定 模 式 的 文 件 名 。 同时 , 你 也 可 以 指 定 grep 命 令 忽 略 大 小 写 。 这 些 选 项 在 附 表 14-1 中 列 出 。

fgrep 命 令

搜 索 文 件 命 令 fgrep 的 搜 索 速 度 要 快 于 grep 命 令 , 且 fgrep 命 令 可 以 一 次迅 速 地 搜 索 多 个 模 式 。 但 是 , 与 grep 不 同 , fgrep 命 令 不 能 搜 索 正 则 表 达 式 。此 外 , 搜 索 文 件 命 令 fgrep 不 能 使 用 特 殊 字 符 , 只 能 搜 索 确 定 的 模 式 。

你 可 以 在 命 令 行 上 键 入 搜 索 的 模 式 , 或 者 使 用 -f 选 项 来 从 文 件 中 读 取 要 搜索 的 模 式 。 在 命 令 行 上 键 入 搜 索 的 模 式 时 , 每 个 模 式 必 须 用 换 行 字 符 隔 开 ( 从文 件 中 读 取 的 搜 索 模 式 也 是 如 此 ) , 且 整 个 搜 索 模 式 列 表 必 须 用 双 引 号 括 起 来 ; 此 外 , 每 个 搜 索 模 式 本 身 还 必 须 用 反 斜 扛 字 符 “ \ ” 隔 开 。 在 下 面 的 例 子 中 , 用 户 搜 索 preface 文 件 中 包 含 字 符 串 “ editor” 及 “ create ” 的 文 本 行 。 必 须 注意 的 是 , 字 符 串 “ edito r” 及 “ create ” 用 换 行 字 符 隔 开 , 且 换 行 字 符 的 前 一 字符 是 反 斜 扛 字 符 “ \ ” 。

$ fgrep "editor\ create" perishables

characters. An editor can be used to create such

用 -f 选 项 , fgrep 命 令 将 从 文 件 中 读 取 搜 索 模 式 列 表 。 该 文 件 中 必 须 包 含 一个 搜 索 模 式 列 表 , 且 每 个 搜 索 模 式 必 须 独 占 一 行 , fgrep 命 令 在 进 行 搜 索 时 将 同时 搜 索 这 些 模 式 。 当 你 经 常 要 搜 索 一 组 常 见 字 符 串 时 , fgrep 命 令 的 该 功 能 非 常有 用 。在 下 面 的 例 子 中 ,用 户 把 要 搜 索 的 模 式 放 置 在 文 件 mypats 中 ,然 后 ,fgrep 命 令 从 文 件 mypats 中 读 取 搜 索 的 模 式 。

$ cat mypats editor

create

$ fgrep -f mypats preface

过 滤 器 编 辑 程 序

与 Unix 系 统 一 样 , 在 Linux 系 统 中 , 文 本 文 件 由 一 系 列 的 文 本 行 组 成 。 因此 , 许 多 编 辑 器 及 过 滤 器 可 以 逐 行 对 文 件 中 的 文 本 行 进 行 操 作 。 Unix 系 统 下 的第 一 个 编 辑 器 Ed 就 是 一 个 行 编 辑 器 , 它 一 次 只 能 在 一 行 文 本 上 进 行 操 作 。 另外 一 些 编 辑 实 用 程 序 及 过 滤 器 命 令 对 文 本 行 的 操 作 与 Ed 编 辑 器 类 似 。 事 实 上 , Ed 编 辑 器 与 其 它 编 辑 器 基 本 上 采 用 了 一 组 相 同 的 核 心 行 编 辑 命 令 。 一 些 过 滤 器编 辑 命 令 如 sed 及 diff 等 使 用 相 同 的 行 编 辑 命 令 来 对 过 滤 器 输 入 进 行 编 辑 。

过 滤 器 编 辑 命 令 用 来 对 过 滤 器 的 输 入 进 行 编 辑 操 作 , 这 些 过 滤 器 的 输 入 可以 是 读 取 于 文 件 的 数 据 或 者 是 接 收 来 自 于 标 准 输 入 的 数 据 。 与 前 面 介 绍 的 过 滤器 命 令 一 样 , 过 滤 器 编 辑 命 令 接 收 输 入 的 数 据 , 并 对 输 入 的 数 据 进 行 各 种 操 作 , 然 后 把 修 改 后 的 输 入 数 据 输 出 。 从 这 种 意 义 上 说 , 数 据 是 被 “ 过 滤 ” 了 。 一 个过 滤 器 编 辑 命 令 接 收 文 本 行 作 为 其 输 入 , 并 可 以 在 文 本 行 上 执 行 行 编 辑 命 令 , 再 输 出 修 改 后 的 文 本 。

有 三 个 主 要 的 过 滤 器 编 辑 命 令 : tr 命 令 , 用 来 转 换 字 符 ; diff 命 令 , 用 来 逐

行 比 较 两 个 文 件 的 不 同 之 处 , 并 输 出 它 们 的 不 同 之 处 ; sed 命 令 , 用 来 对 输 入的 数 据 执 行 行 编 辑 操 作 。 作 为 一 个 过 滤 器 命 令 , sed 命 令 不 修 改 任 何 原 文 件 , 相 反 , 它 只 产 生 原 文 件 的 一 个 修 改 版 。 过 滤 器 diff 命 令 以 行 编 辑 操 作 的 形 式 提供 编 辑 信 息 , 它 告 诉 用 户 需 要 执 行 哪 些 行 编 辑 命 令 可 以 把 第 一 个 文 件 修 改 至 与第 二 个 文 件 完 全 相 同 。 这 些 行 编 辑 操 作 本 身 就 告 诉 你 比 较 的 两 个 文 件 之 间 怎 样不 同 。

14.4.1 流 式 编 辑 器 : sed

过 滤 器 命 令 sed 对 其 输 入 的 数 据 执 行 行 编 辑 操 作 。 其 中 , 输 入 的 数 据 可 以从 文 件 中 读 取 , 也 可 以 接 收 来 自 于 标 准 输 入 的 数 据 。sed 命 令 名 来 自 于“ stream edito r” 的 缩 写 。 sed 命 令 有 两 个 参 数 , 一 个 是 行 编 辑 操 作 参 数 , 另 一 个 是 文 件名 列 表 参 数 。 通 过 行 编 辑 命 令 参 数 , sed 命 令 将 生 成 文 件 名 列 表 中 所 指 定 的 文件 的 相 应 修 改 版 , 然 后 把 这 些 修 改 版 输 出 至 标 准 输 出 , 而 所 有 的 原 文 件 本 身 并不 被 修 改 。 无 论 是 否 被 修 改 过 , 原 文 件 中 的 文 本 行 都 将 被 输 出 。 从 这 种 意 义 上说 , sed 命 令 生 成 所 有 输 入 文 件 的 一 个 完 整 拷 贝 , 尽 管 这 个 拷 贝 被 编 辑 、 修 改过 。

$ sed "edit-command' file-list

set 编 辑 器 有 一 组 编 辑 命 令 , 这 组 编 辑 命 令 与 Ed 行 编 辑 器 的 编 辑 命 令 相 同 。sed 命 令 中 的 命 令 参 数 必 须 用 单 引 号 括 起 来 , 以 防 止 编 辑 命 令 中 的 特 殊 字 符 被Shell 所 解 释 或 分 割 。 sed 编 辑 命 令 在 附 表 14-2 中 列 出 。 在 下 面 的 例 子 中 , sed 命 令 生 成 了 preface 文 件 的 一 个 修 改 版 。 其 中 , 编 辑 命 令 “ 3 d” 与 行 编 辑 命 令完 全 相 同 , 即 删 除 文 件 的 第 三 行 。 因 此 , sed 命 令 将 显 示 出 preface 文 件 的 修改 版 ( 删 除 了 第 三 行 文 本 ) 。

$ sed '3 d' preface A text of file in Unix

consists of a stream of be used to create such text files, changing or adding to the character

data in the file.

与 Ed 编 辑 器 编 辑 命 令 一 样 , sed 编 辑 器 的 编 辑 命 令 也 是 单 个 字 符 。 例 如 , 字 符 d 表 示 用 来 删 除 一 文 本 行 ; a 命 令 用 来 在 当 前 行 之 后 插 入 文 本 ; n 命 令 将使 编 辑 器 带 行 号 输 出 文 本 行 ; i 命 令 用 来 在 当 前 行 之 前 插 入 文 本 ; c 命 令 将 用 新的 文 本 替 换 一 行 或 多 行 ; s 命 令 用 来 用 指 定 的 替 换 模 式 替 换 文 本 行 上 指 定 的 字符 串 。 所 有 这 些 编 辑 操 作 与 对 应 的 Ed 编 辑 器 中 的 编 辑 命 令 完 全 相 同 。

一 个 非 常 常 见 的 行 编 辑 操 作 是 模 式 替 换 操 作 。 与 Ed 编 辑 器 中 的 替 换 命 令 一样 , sed 命 令 的 替 换 命 令 也 是 在 命 令 s 后 键 入 搜 索 的 模 式 ( 被 替 换 的 文 本 ) 与要 替 换 文 本 。 替 换 命 令 将 用 要 替 换 的 文 本 替 换 与 搜 索 模 式 匹 配 的 字 符 串 。

$ sed 's /create/generate/' preface A text file in Unix

consists of a stream of be used to generate such text files, changing or adding to the character data in the file.

sed 命 令 可 以 同 时 执 行 几 个 编 辑 命 令 。 你 可 以 在 命 令 行 上 输 入 编 辑 命 令 , 也 可 以 把 编 辑 命 令 放 置 在 一 个 文 件 中 , 当 执 行 sed 命 令 时 , 系 统 将 读 取 该 文 件 。sed 命 令 的 -e 选 项 可 以 使 用 户 在 命 令 行 上 输 入 多 个 编 辑 命 令 , 且 在 每 个 编 辑 命令 之 前 必 须 输 入 -e 选 项 。 sed 命 令 的 -f 选 项 可 以 让 用 户 从 一 个 文 件 中 读 取 一 组行 编 辑 命 令 , 其 用 法 是 : sed 命 令 后 键 入 -f 选 项 , 然 后 输 入 保 存 了 一 组 行 编 辑命 令 的 文 件 名 , 最 后 输 入 文 件 名 列 表 。 运 行 sed 命 令 时 , sed 命 令 将 从 -f 选 项后 指 定 的 文 件 中 读 取 行 编 辑 命 令 。 在 下 面 的 例 子 中 , 行 编 辑 命 令 是 从 文 件 myed

中 读 取 的 。

$ sed -f myed preface

$ cat myed ld

s/create/generate/g

尽 管 sed 命 令 的 许 多 编 辑 命 令 与 Ed 行 编 辑 器 中 的 编 辑 相 同 , 但 是 , 那 些 由多 行 组 成 的 命 令 须 从 文 件 中 读 取 。 例 如 a 命 令 将 在 当 前 行 之 后 添 加 文 本 , 此 时 , 你 添 加 的 文 本 将 不 止 一 行 。 因 此 , 你 可 以 在 文 件 中 保 存 这 些 编 辑 命 令 : 在 文 件的 第 一 行 上 输 入 a 命 令 , 然 后 在 余 下 的 行 上 输 入 添 加 的 文 本 , 且 在 每 行 的 行 尾 , 你 必 须 键 入 换 行 符 。 这 样 做 可 以 防 止 Shell 把 换 行 特 殊 字 符 解 释 为 Linux 命 令 的结 束 。

sed 命 令 把 接 收 的 输 入 看 作 是 流 式 数 据 , 它 可 以 从 标 准 输 入 中 读 取 这 一 流式 数 据 , 也 可 以 从 文 件 中 读 取 这 一 流 式 数 据 。 如 果 在 sed 命 令 的 命 令 行 上 没 有指 定 文 件 名 , 那 么 , 它 将 从 标 准 输 入 上 读 取 数 据 。 在 输 入 流 式 数 据 的 过 程 中 , 无 论 是 从 文 件 中 读 取 数 据 还 是 从 标 准 输 入 上 读 取 数 据 , 你 都 可 以 用 行 号 来 定 位文 本 行 。 通 过 标 准 输 入 , 并 使 用 管 道 , sed 命 令 可 以 接 收 来 自 其 它 Linux 命 令的 输 出 数 据 。 同 时 , sed 命 令 还 可 以 接 收 从 键 盘 ( 标 准 输 入 设 备 ) 输 入 的 数 据 。此 外 , 数 据 还 可 以 是 来 自 于 文 件 或 设 备 的 重 定 向 数 据 。 总 之 , sed 编 辑 器 命 令是 在 编 辑 流 式 数 据 , 这 就 是 sed 命 令 的 命 令 名 由 来 。

你 可 以 把 sed 命 令 看 作 是 具 有 编 辑 功 能 的 cat 命 令 。 与 cat 命 令 一 样 , sed 命 令 可 以 接 收 来 自 于 标 准 输 入 的 数 据 , 也 可 以 是 来 自 于 文 件 名 列 表 中 文 件 的 内容 。 如 果 在 sed 命 令 的 命 令 行 上 把 文 件 名 列 表 作 为 其 输 入 , 它 将 从 这 些 文 件 中读 取 数 据 作 为 其 输 入 , 如 果 没 有 指 定 文 件 名 , 那 么 , sed 命 令 将 从 标 准 输 入 上

读 取 输 入 数 据 。 与 cat 命 令 一 样 , sed 命 令 会 把 输 入 数 据 的 拷 贝 输 出 到 标 准 输出 上 , 但 是 , 与 cat 不 同 , sed 命 令 将 对 其 拷 贝 进 行 编 辑 操 作 , 这 些 编 辑 操 作由 命 令 行 上 的 第 一 个 参 数 指 定 。 这 些 行 编 辑 操 作 将 对 将 要 输 出 的 数 据 进 行 相 应操 作 , 然 后 生 成 原 输 入 的 一 个 修 改 版 , 且 其 命 令 行 上 指 定 的 原 文 件 ( 包 括 文 件名 列 表 中 的 所 有 文 件 ) 将 不 作 任 何 修 改 , 只 是 标 准 输 出 中 的 内 容 被 修 改 。 标 准输 出 还 可 以 通 过 重 定 向 操 作 输 处 到 指 定 的 文 件 中 去 , 以 创 建 一 个 新 的 文 件 ( 原文 件 的 修 改 版 ) 。 在 下 面 的 例 子 中 , sed 命 令 的 修 改 输 出 通 过 重 定 向 操 作 后 , 被 保 存 到 pfile 文 件 中 , 即 pfile 文 件 就 是 preface 文 件 的 一 个 修 改 版 。

$ sed '3 d' preface > pfile

14.4.3 文 件 差 别 与 修 改 命 令 : diff 命 令

过 滤 器 命 令 diff 用 来 比 较 两 个 文 件 , 并 输 出 那 些 内 容 不 同 的 文 本 行 。 diff 命令 不 仅 能 显 示 两 个 文 件 是 否 相 同 , 而 且 能 详 细 显 示 比 较 的 两 个 文 件 在 哪 些 地 方不 同 。 过 滤 器 命 令 diff 还 输 出 一 些 行 编 辑 信 息 , 这 些 信 息 可 以 帮 助 你 怎 样 将 第一 个 文 件 的 内 容 修 改 到 与 第 二 个 文 件 完 全 相 同 。 对 第 一 个 文 件 将 要 进 行 的 编 辑修 改 信 息 详 细 说 明 了 它 怎 样 与 第 二 个 文 件 不 同 。 从 这 种 意 义 上 说 , diff 命 令 的 输出 信 息 实 际 上 是 编 辑 信 息 。

当 你 在 编 辑 一 个 文 件 ,且 你 想 知 道 你 所 编 辑 的 文 件 是 怎 样 被 修 改 的 时 候 ,diff

命 令 输 出 的 编 辑 信 息 就 会 对 你 非 常 有 帮 助 。 你 可 以 保 存 修 改 前 的 原 文 件 , 同 时保 存 一 个 经 过 修 改 后 的 文 件 。 此 时 , 如 果 想 查 看 修 改 后 的 文 件 是 怎 样 被 修 改 的 , 你 可 以 使 用 diff 命 令 来 比 较 原 文 件 及 当 前 修 改 后 的 文 件 。

从 两 个 文 件 的 第 一 行 开 始 , diff 命 令 将 逐 行 比 较 第 一 个 文 件 与 第 二 个 文 件 相

应 行 之 间 的 差 别 。 该 命 令 将 只 输 出 两 文 件 那 些 不 相 同 的 文 本 行 , 换 句 话 说 , 将输 出 两 个 文 件 各 自 独 有 的 行 文 本 行 。 第 一 个 文 件 中 独 有 的 行 在 被 列 出 时 将 在 每行 之 前 加 一 个 小 于 符 号 “ < ” , 而 第 二 个 文 件 中 独 有 的 行 在 被 列 出 时 将 在 每 行 之前 加 一 个 大 于 符 号 “ > ” 。 两 个 文 件 中 完 全 相 同 的 行 将 不 被 列 出 。

$ diff file1 file2

file1-linenums edit-command file2-linenums

<Differing line in file1

>Differing line in file2

在 每 行 之 前 , diff 输 出 编 辑 信 息 , 这 些 信 息 表 明 你 怎 样 修 改 第 一 个 文 件 , 就可 以 使 第 一 个 文 件 与 第 二 个 文 件 完 全 相 同 ( 第 一 个 文 件 可 能 需 要 在 文 件 的 不 同地 方 经 过 多 个 不 同 的 编 辑 修 改 ) 。 每 个 修 改 都 有 一 个 编 辑 提 示 , 其 后 跟 着 两 个文 件 中 对 应 的 不 同 文 本 行 。 如 果 要 使 比 较 的 两 个 文 件 完 全 相 同 , 第 一 个 文 件 中有 的 行 可 能 需 要 被 删 除 , 或 者 需 要 被 添 加 , 或 者 需 要 被 修 改 。 行 修 改 提 示 以 行号 开 头 , 其 后 跟 着 可 能 的 三 种 编 辑 命 令 提 示 字 符 : 或 a 字 符 , 或 d 字 符 , 或 c 字 符 。 a 字 符 表 明 哪 些 文 本 行 必 须 从 第 二 个 文 件 添 加 至 第 一 个 文 件 中 。 其 意 义与 Ed 行 编 辑 器 中 的 编 辑 命 令 a 相 同 , 即 需 添 加 文 本 行 。 在 a 编 辑 命 令 提 示 符之 后 , diff 命 令 将 列 出 那 些 需 要 从 文 件 file2 中 插 入 到 文 件 file1 中 的 文 本 行 。

d 编 辑 命 令 提 示 符 表 明 要 使 第 一 个 文 件 与 第 二 个 文 件 相 同 , 第 一 个 文 件 中 的哪 些 文 本 行 需 要 被 删 除 。 其 意 义 与 Ed 行 编 辑 器 中 的 编 辑 命 令 d 相 同 , 即 需 删除 文 本 行 。 在 d 编 辑 命 令 提 示 符 之 后 , diff 命 令 将 列 出 那 些 需 要 从 文 件 file1 中删 除 的 文 本 行 。 c 编 辑 命 令 提 示 符 表 明 要 使 第 一 个 文 件 与 第 二 个 文 件 相 同 , 第一 个 文 件 中 的 哪 些 文 本 行 需 要 被 修 改 。 其 意 义 与 Ed 行 编 辑 器 中 的 编 辑 命 令 c 相 同 , 即 需 修 改 文 本 行 。 在 c 编 辑 命 令 提 示 符 之 后 , diff 命 令 将 列 出 两 文 件 中 的

文 本 行 , 以 帮 助 用 户 要 使 第 一 个 文 件 与 第 二 个 文 件 完 全 相 同 , 第 一 个 文 件 中 的哪 些 文 本 将 要 被 修 改 , 且 两 文 本 行 之 间 用 破 折 线 隔 开 。 下 面 的 例 子 列 出 了 diff 命 令 输 出 的 行 提 示 符 句 法 。

f1-linenum a f2-line1, f2-line2Append lines from file2 to after f1-linenum in file1.> file2 lines

f1-line1, f1-line2 d f2-linenum Delete the lines in file1.

< file1 lines

f1-line1 f1-line2 c f2-line1, f2-line2 Replace lines in file1 with lines in file2.

< file1 lines


  • file2 lines

在 编 辑 命 令 提 示 符 的 前 后 都 有 一 个 行 号 或 一 系 列 的 行 号 ( 行 号 范 围 ) 。 在编 辑 命 令 提 示 符 前 的 行 号 用 来 定 位 第 一 个 文 件 , 而 编 辑 提 示 符 后 的 行 号 用 来 定位 第 二 个 文 件 。 diff 命 令 将 从 左 至 右 读 取 编 辑 提 示 行 , 从 而 指 定 你 如 何 根 据 第 二个 文 件 来 修 改 第 一 个 文 件 。 例 如 , 对 于 diff 命 令 编 辑 提 示 行 从 左 至 右 为“ 5a10,14 ” , 则 该 提 示 行 表 示 需 把 第 二 个 文 件 中 的 第 10 至 14 行 插 入 到 第 一个 文 件 的 第 5 行 之 后 。 经 过 上 述 修 改 之 后 , 第 一 个 文 件 将 与 第 二 个 文 件 完 全 相同 。 编 辑 提 示 行 “ 3d ” 表 示 要 使 第 一 个 文 件 与 第 二 个 文 件 完 全 相 同 , 需 删 除 第三 行 。 编 辑 提 示 行 “ 4,6c9 ” 表 示 需 对 第 一 个 文 件 的 第 4 至 6 行 进 行 修 改 ( 用 第二 个 文 件 的 第 9 行 进 行 替 换 ) 。

如 果 需 要 , 你 可 以 把 diff 命 令 的 输 出 通 过 重 定 向 操 作 保 存 到 文 件 中 去 。 在 下面 的 例 子 中 ,用 户 把 doc.v1 文 件 与 doc.v5 文 件 之 间 的 差 别 保 存 到 文 件 change5

中 去 。 如 果 你 正 在 对 原 文 件 进 行 修 改 , 你 可 以 把 修 改 后 的 文 件 保 存 下 来 , 然 后再 比 较 原 文 件 与 修 改 后 的 文 件 之 间 的 差 别 , 并 把 它 们 的 差 别 保 存 下 来 , 此 时 被保 存 的 文 件 将 是 你 到 目 前 为 止 的 修 改 记 录 。 在 上 例 中 , 你 可 以 把 doc.v1 文 件 理解 为 原 文 件 , 而 把 doc.v5 文 件 看 作 为 原 文 件 的 最 新 版 本 , 则 文 件 change5 包含 文 件 doc.v5 相 对 于 文 件 doc.v1 的 所 有 修 改 。 当 你 继 续 进 行 修 改 的 时 候 , 你可 以 再 用 diff 命 令 来 记 录 文 件 的 修 改 。 总 之 , 你 可 以 使 用 该 命 令 来 记 录 你 修 改文 件 的 过 程 。

$ diff -b doc.v1 doc.v5 > change5

正 则 表 达 式

正 则 表 达 式 可 以 允 许 你 对 各 种 可 能 的 模 式 进 行 匹 配 , 你 也 可 以 用 这 些 可 能的 模 式 定 位 于 文 本 的 不 同 位 置 。 你 可 以 在 文 本 中 搜 索 以 不 同 的 字 符 开 头 或 结 尾的 模 式 , 或 者 搜 索 与 行 尾 或 行 首 文 本 匹 配 的 模 式 。 正 则 表 达 式 中 的 特 殊 字 符 有如 下 几 个 : “ ^ ” 、 “ $ ” 、 “ * ” 、 “ .” 及 “ [ ] ” 等 。 符 号 “ ^” 及 符 号 “ $ ” 分 别 表 示 与 文 本 行 的 行 尾 与 行 首 匹 配 ; 星 号 “ *” 表 示 重 复 ( 包 括 0 次 与 1 次 ) 出 现 的 字 符 ; 而 句 点 表 示 与 任 意 的 单 个 字 符 匹 配 ; 方 括 号 “ [ ] ” 表 示 与 一 类字 符 匹 配 。

与 行 尾 及 行 首 字 符 匹 配 的 特 殊 字 符 : “ ^” 与 “ $ ”

如 果 你 想 与 行 首 的 模 式 匹 配 , 你 可 以 在 模 式 中 首 先 键 入 特 殊 字 符 “ ^ ” , 然后 输 入 搜 索 的 模 式 。 在 下 面 的 例 子 中 , 正 则 表 达 式 “ ^consists ” 与 行 首 的 模 式“ consists ” 匹 配 。

^consists

consists of a stream of

如 下 的 例 子 使 用 特 殊 字 符 “ $ ” 来 与 行 尾 的 模 式 匹 配 。

such$

be used to create such

与 任 何 单 个 字 符 都 匹 配 的 特 殊 字 符 : “ .”

句 号 “ .” 可 以 匹 配 任 意 的 单 个 字 符 。 句 号 “ .” 可 以 与 你 搜 索 模 式 中 的 任 何字 符 都 匹 配 。 例 如 , 模 式 “ b.d ” 将 搜 索 到 由 三 个 字 符 组 成 的 字 符 串 , 该 字 符 串的 首 字 符 为 字 符 “ b ” , 第 三 个 字 符 为 字 符 “ d ” , 而 第 二 个 字 符 可 以 是 任 何 字符 。 例 如 , 该 模 式 将 与 “ bid ” , “ bad ” , “ bed ” , “ b+d ” 及 “ b d ” 等 字符 串 匹 配 ( 注 意 空 格 也 是 一 个 有 效 字 符 , tab 键 也 是 如 此 ) 。

对 于 单 个 特 殊 字 符 “ .” , 必 须 通 过 其 前 后 的 字 符 或 字 符 串 才 能 达 到 应 有 的效 果 , 即 通 过 上 下 文 关 系 。 模 式 “ b.d ” 中 特 殊 字 符 “ .” 的 上 下 文 关 系 为 : 其前 面 的 字 符 为 字 符 “ b ” , 其 后 面 的 字 符 为 字 符 “ d ” 。 如 果 在 模 式 “ b.” 后 面没 有 字 符 “ d ” , 那 么 , 任 何 以 字 符 “ b ” 开 头 , 不 少 于 两 个 字 符 的 字 符 串 都 与

上 述 模 式 匹 配 , 如 “ bid ” , “ bath ”, “ bedroom ”, “ bum p”, “ submit ” , “ habit ”及 “ harbor” 等 。

你 可 以 在 正 则 表 达 式 中 使 用 任 意 多 个 特 殊 字 符 “ .” 。 你 可 以 在 模 式 中 连 续键 入 多 个 特 殊 字 符 “ .” 来 与 前 缀 或 后 缀 匹 配 。 例 如 , 模 式 “ box.. ” 将 与 字 符 串“ box ” 开 头 、 以 任 意 两 个 字 符 结 尾 的 字 符 串 匹 配 。 例 如 , 它 可 以 与 “ boxe s” 、“ boxer” 及 “ boxed ” 等 字 符 串 匹 配 。

你 也 可 以 在 正 则 表 达 式 中 把 特 殊 字 符 “ .” 与 特 殊 字 符 “ ^ ” 及 “ $ ” 混 合 使用 , 以 便 搜 索 与 行 首 或 行 尾 的 字 符 串 相 匹 配 的 模 式 。 假 设 你 有 一 个 文 件 , 该 文件 中 有 些 文 本 行 以 文 件 名 为 结 尾 , 而 你 想 在 文 件 中 搜 索 这 些 以 文 件 名 “ week ” 为 结 尾 的 字 符 串 , 且 该 文 件 只 有 5 个 字 符 , 例 如 week1 , week2 , weeka 等 , 但 不 是 weekend , 这 时 , 你 可 以 使 用 模 式“ week.$ ” 来 搜 索 与 之 匹 配 的 字 符 串 。

week.$

report on week4

report on week15 不 匹 配

week1 weather 不 匹 配

重 复 匹 配 特 殊 字 符 : “ *”

星 号 特 殊 字 符 “ * ” 将 多 次 重 复 匹 配 一 个 字 符 ( 包 括 0 次 与 1 次 ) 。 要 匹 配的 字 符 是 模 式 中 星 号 “ * ” 前 面 的 字 符 。 你 可 以 把 星 号 “ * ” 理 解 为 一 个 操 作 算子 , 而 把 它 前 面 的 字 符 作 为 其 操 作 数 。 星 号 将 重 复 匹 配 其 前 面 的 字 符 。 下 面 是特 殊 字 符 “ * ” 的 句 法 :

c* 该 正 则 表 达 式 将 与 任 意 个 c 相 匹 配 , 例 如 “ c ” 、 “ cc ” 、 “ ccc ” 、

“ cccc ” 等 。

当 你 需 要 替 换 一 个 字 符 的 多 次 重 复 时 , 用 特 殊 字 符 “ * ” 号 是 非 常 方 便 的 。下 面 的 例 子 中 , 与 字 符 “ b ” 开 头 , 其 后 跟 着 一 系 列 连 续 的 字 符 “ o ” 相 匹 配 字符 串 可 以 用 正 则 表 达 式 “ bo* ” 来 匹 配 。 因 此 , 与 该 正 则 表 达 式 相 匹 配 的 字 符 或字 符 串 有 “ boooo ” 、 “ bo ” 、 “ boo ”及 “ b ” 等 。

bo* book born booom

zoom 不 匹 配

有 必 要 给 特 殊 字 符 “ * ” 号 提 供 一 个 上 下 文 关 系 字 符 , 而 特 殊 字 符 “ *” 将 与重 复 0 次 或 任 意 次 其 前 面 的 字 符 匹 配 。 假 如 你 想 在 文 本 中 搜 索 一 个 或 多 个 连 续字 符 “ b ” , 例 如 字 符 或 字 符 窜 “ b ” 、 “ bb ” 或 “ bbb ” 等 。 你 可 能 认 为 模 式“ b* ” 可 以 达 到 上 述 目 的 , 但 实 际 上 是 达 不 到 的 , 因 为 模 式 “ b* ” 也 可 以 与 出现 0 次 的 字 符 “ b ” 匹 配 。 因 此 文 本 行 上 的 任 何 字 符 都 与 模 式 “ b *” 匹 配 。 在 下面 的 例 子 中 , 模 式 “ b* ” 将 匹 配 任 何 字 符 , 因 为 尽 管 下 面 的 文 本 行 中 的 首 字 符都 不 是 字 符 “ b ” , 但 都 是 出 现 了 0 次 “ b ” 字 符 的 文 本 行 。

b* aaaaa abb aabbb

为 了 避 免 上 述 问 题 , 你 可 以 在 特 殊 字 符 “ * ” 前 输 入 上 下 文 关 系 字 符 。 对 于上 述 问 题 , 你 可 以 在 特 殊 字 符 “ * ” 输 入 字 符 “ b ” , 此 时 , 模 式 “ bb* ” 将 与 一

个 或 任 意 个 字 符 ( 窜 ) 匹 配 。 实 际 上 , 在 进 行 模 式 匹 配 时 , 系 统 将 首 先 搜 索 与字 符 “ b ” 匹 配 的 字 符 然 后 与 重 复 任 意 次 的 字 符 “ b ” 匹 配 ( 包 括 0 次 ) 。 下 面的 例 子 中 , 模 式 “ bb* ” 将 与 上 例 第 二 、 三 行 文 本 中 的 字 符 串 “ bb ” 及 “ bbb ” 匹 配 。

bb*

aaaa 不 匹 配

abb aabbb

模 式 “ .* ” 与 文 本 行 上 的 任 意 字 符 都 匹 配 。 事 实 上 , 模 式 “ .* ” 将 与 整 行 文本 匹 配 。 如 果 你 在 字 符 串 “ .* ” 前 输 入 上 下 文 关 系 字 符 或 字 符 串 , 那 么 , 你 可以 用 该 模 式 来 匹 配 文 本 行 中 的 各 种 文 本 块 。 例 如 , 如 果 在 模 式 “ .* ” 之 前 有 一字 符 串 , 那 么 , 该 字 符 串 与 模 式 “ .* ” 合 并 成 的 模 式 将 匹 配 该 字 符 串 至 文 本 行行 尾 的 所 有 文 本 ; 如 果 在 模 式 “ .* ” 之 后 有 一 字 符 串 , 那 么 , 该 模 式 “ .* ” 与 该字 符 串 合 并 成 的 模 式 将 匹 配 该 文 本 行 行 首 至 该 字 符 串 的 所 有 文 本 ; 如 果 在 模 式“ .* ” 的 前 后 都 有 字 符 或 字 符 串 , 那 么 , 由 这 些 字 符 串 与 模 式 “ .*” 组 成 的 文 本将 匹 配 文 本 行 上 前 后 字 符 串 之 间 的 所 有 文 本 。 看 下 面 的 例 子 : 模 式 “ .*and ” 将匹 配 文 本 行 行 首 至 字 符 串 “ and ” 之 间 ( 包 括 字 符 串 “ and ” ) 的 所 有 文 本 ; 模式 “ and*. ” 将 匹 配 从 字 符 窜 “ and ” ( 包 括 “ and ” ) 至 文 本 行 行 尾 之 间 的 所有文本;另外,模 式“ o.*F ”将与字 符“ o ”与“ F ” 之 间( 包 括 字 符“ o ”与“ F ” ) 的 所 有 的 文 本 匹 配 。

.*andHello to you and to them Farewell

and.*Hello to you and to them Farewell o.*F Hello to you and to them Farewell

由 于 特 殊 字 符 “ * ” 可 以 与 0 次 重 复 或 任 意 次 重 复 的 字 符 串 匹 配 , 例 如 , 模式 “ I.* t” 与 “ Intelligen t” 匹 配 , 同 时 它 还 与 字 符 串 “ It” 匹 配 , 因 此 , 你 可 以在 进 行 模 式 搜 索 时 给 该 特 殊 字 符 提 供 一 个 上 下 文 关 系 字 符 。

字 符 类 特 殊 字 符 : “ [ ] ”

如 果 你 需 要 去 匹 配 一 组 设 定 的 字 符 或 字 符 串 , 而 不 是 匹 配 一 个 指 定 的 字 符或 字 符 串 , 或 者 不 是 去 匹 配 任 意 字 符 , 那 么 , 你 可 以 使 用 特 殊 字 符 “ [ ] ” 来定 义 一 组 字 符 。 例 如 , 你 可 能 想 去 匹 配 与 字 符 “ A ” 或 者 “ H ” 结 尾 的 单 词 , 如“ seriesA ” 或 “ seriesH ” , 而 不 是 单 词 “ seriesB ” 或 “ seriesK ” 。 此 时 , 如果 你 输 入 特 殊 字 符 “ .” 去 匹 配 , 那 么 , 你 将 与 所 有 的 字 符 都 匹 配 。 但 是 , 你 想指 定 你 要 匹 配 的 字 符 只 可 能 是 “ A ” 或 者 是 “ H ” , 这 时 , 用 特 殊 字 符 “ [ ] ” 可 以 达 到 上 述 目 的 。

你 可 以 在 方 括 号 特 殊 字 符 “ [ ] ” 来 匹 配 一 组 可 能 的 字 符 , 这 组 可 能 的 字符 依 次 被 放 置 在 特 殊 字 符 “ [ ] ” 内 ( 它 们 的 顺 序 如 何 并 不 重 要 ) 。 你 可 以 把这 组 可 能 的 字 符 认 为 是 你 定 义 的 一 个 字 符 类 。 对 于 任 意 字 符 , 如 果 字 符 集 中 定义 了 该 字 符 , 那 么 , 我 们 可 以 认 为 该 字 符 与 这 一 字 符 集 匹 配 。 你 可 能 已 经 意 识到 , 正 则 表 达 式 中 的 特 殊 字 符 “ [ ] ” 与 Shell 下 特 殊 字 符 “ [ ” 、 “ ] ” 的用 法 非 常 相 似 。看 下 面 的 例 子 :用 户 用 正 则 表 达 式“ do c[ agN ]”来 搜 索 以“ doc ” 开 头 、以 字 符“ a ”、“ g ”或“ N ”结 尾 的 字 符 串 。该 正 则 表 达 式 与 字 符 串“ doca ”, “ docg ”及 “ docN ” 等 匹 配 , 而 不 与 字 符 串 “ docP ” 匹 配 。

doc [ agN ]

List of documents

doca docb

docg docN docP

方 括 号 特 殊 字 符 在 匹 配 各 种 模 式 的 前 后 缀 时 非 常 有 用 。 例 如 , 如 果 你 想 匹配 文 件 中 以 前 缀 “ week ” 开 头 的 几 个 不 同 模 式 , 如 “ week1 ” , “ week2 ” 等 , 你 可 以 使 用 方 括 号 特 殊 字 符 。 在 下 面 的 例 子 中 , 模 式 “ week [ 245 ] ” 将 与 字符 串 “ week2 ”, “ week4 ” 等 字 符 串 匹 配 , 而 不 与 字 符 串 “ week1 ” 匹 配 。

week [ 245 ] week2 weather report on week4

week1 reports 不 匹 配

方 括 号 特 殊 字 符 也 可 以 非 常 方 便 地 去 匹 配 以 大 写 或 者 小 写 字 母 开 头 的 模式 。由 于 Linux 系 统 是 区 分 大 小 写 的 ,因 此 ,模 式“ computer ”与 模 式“ Computer ” 是 不 同 的 。字 符 串“ computer ”将 不 会 与 以 大 小 字 母“ C ”开 头 的 单 词“ compute r” 匹 配 。 为 了 同 时 搜 索 文 件 中 以 大 写 字 母 “ C ” 及 小 写 字 母 “ c ” 开 头 的 单 词“ compute r” , 你 可 以 在 方 括 号 特 殊 字 符 中 指 定 字 符 “ c ” 或 者 “ C ” 为 搜 索模 式 的 可 能 首 字 符 。 例 如 , 模 式 “ [ cC ] omputer ” 将 匹 配 文 件 中 以 字 母 “ c ”

( 不 管 是 否 是 大 小 写 ) 开 头 的 单 词 “ compute r” 。

有 时 , 你 可 能 想 去 搜 索 除 了 几 种 指 定 模 式 之 外 的 所 有 其 它 可 能 模 式 ( 你 可以 把 这 些 例 外 的 模 式 认 为 是 某 类 模 式 的 补 集 ) 。 为 了 搜 索 除 了 几 种 指 定 的 模 式之 外 的 所 有 其 它 可 能 模 式 , 你 可 以 使 用 特 殊 字 符 “ ^ ” , 该 特 殊 字 符 被 放 置 在 方括 号 之 内 , 而 被 放 置 在 一 些 指 定 的 字 符 之 前 。 与 前 面 所 述 的 匹 配 相 反 , 方 括 号特 殊 字 符 代 表 任 何 与 不 在 方 括 号 内 指 定 的 字 符 匹 配 。 例 如 , 为 了 匹 配 所 有 以 字符 串 “ wee k” 开 头 而 不 以 字 符 “ 5 ” 和 “ 7 ” 结 尾 的 字 符 串 , 你 可 以 使 用 如 下 的

模 式 :

week [ ^57 ]

week7 weather 不 匹 配reports on week4 week5 reports 不 匹 配

你 可 以 用 破 折 号 “ -” 在 方 括 号 内 指 定 一 个 字 符 范 围 。 在 ASCII 字 符 集 中 , 小 写 字 母 是 一 组 连 续 的 ASCII 码 字 符 , 你 可 以 用[ a-z ] 来 代 表 所 有 的 小 写 字 母 。看 下 面 的 两 个 例 子 : 在 第 一 个 例 子 中 , 模 式 “ doc [ a-z ] ” 将 和 字 符 串 “ doc ” 与 任 何 小 写 字 母 组 成 的 字 符 串 匹 配 ; 你 也 可 以 在 方 括 号 内 指 定 多 个 字 符 范 围 , 第 二 个 例 子 中 的 模 式 “ doc [ A-Za-z ] ” 将 和 字 符 串 “ doc ” 与 所 有 英 文 字 母 组成 的 字 符 串 匹 配 。

doc [ a-z ] doca docg docN docP doc1

doc [ A-Za-z ] doca docg docN docP doc1

通 过 指 定 范 围 , 模 式 “ week [ 14 ] [ ^12 ] ” 可 以 被 更 精 确 地 重 新 表 示 为模 式“ wee k[ 14 ] [ 3-9 ] ” 。 对 于 前 一 个 特 殊 模 式“ [ ^12 ] ” 将 与 除 字 符“ 1 ” 与 “ 2 ” 以 外 的 任 何 字 符 ( 包 括 字 母 字 符 ) 匹 配 , 而 后 一 个 特 殊 模 式 使 用 范 围“ [ 3-9 ] ” , 此 时 , 特 殊 模 式 “ [ 3-9 ] ” 将 仅 与 字 符 “ 3 ” 与 字 符 “ 9 ” 之 间

( 包 括 字 符 “ 3 ” 及 “ 9 ” ) 的 数 字 字 符 匹 配 。

week [ 14 ] [ 3-9 ] week43 weather reports on week15 week41 reports 不 匹 配week4g reports 不 匹 配

你 可 以 使 用 方 括 号 特 殊 字 符 及 其 它 特 殊 字 符 来 创 建 一 些 非 常 高 效 的 匹 配 模式 。 如 果 你 使 用 方 括 号 特 殊 字 符 与 星 号 特 殊 字 符 的 组 合 , 那 么 , 可 以 用 它 们 来匹 配 一 组 任 意 重 复 的 字 符 。 例 如 , 模 式 “ doc [ 123 ] * ” 将 搜 索 任 意 以 字 符 串“ doc ” 开 头 、 以 字 符 “ 1 ” 、 “ 2 ” 与 “ 3 ” 的 任 意 组 合 为 结 尾 的 字 符 串 , 如 模式 “ doc221 ” 及 模 式 “ doc3321311 ” 等 。 要 搜 索 字 符 串 “ doc ” 与 任 意 的 数 字字 符 的 组 合 , 你 可 以 用 模 式 [ 0-9 ] 来 指 定 。 因 此 , 模 式 “ doc [ 0-9 ] * ” 将 匹配 任 何 与“ do c ”开 头 ,并 以 任 何 、任 意 个 数 字 字 符 为 结 尾 的 字 符 串 ,如“ doc582 ”、“ doc7834103 ” 等 。 你 也 可 以 使 用 方 括 号 特 殊 字 符 与 星 号 特 殊 字 符 的 组 合 来 搜索 以 指 定 的 数 字 开 头 ,或 以 指 定 的 数 字 为 结 尾 的 整 数 字 符 ,例 如 ,模 式“ 2 3[ 0-9 ]

* ” 将 搜 索 所 有 以 “ 23 ” 开 头 的 数 , 如 “ 23 ” 、 “ 235 ” 及 “ 2378945 ” 等 。 模式“ [ 0-9 ]\ ..50 ” 将 匹 配 任 何 与“ 0.50 ”为结尾的数,如“ 7.50 ” 、“ 1000.50 ” 等 。

使 用 指 定 的 字 符 范 围 与 星 号 特 殊 字 符 的 组 合 , 你 可 以 搜 索 一 些 有 一 定 特 性的 模 式 , 例 如 , 你 可 以 搜 索 只 含 有 小 写 字 母 的 模 式 , 或 者 只 含 有 数 字 字 符 的 模式 。 对 于 上 述 情 况 , 你 必 须 注 意 要 给 星 号 特 殊 字 符 提 供 用 来 搜 索 的 上 下 文 关 系字 符 , 同 时 需 记 住 特 殊 符 号 星 号“ *” 可 以 与 一 个 字 符 的 0 次 或 任 意 次 重 复 匹 配 。如 果 要 把 指 定 的 字 符 范 围 作 为 星 号 字 符 的 上 下 文 关 系 字 符 , 你 只 需 在 星 号 特 殊字 符 “ * ” 之 前 再 键 入 一 次 该 字 符 范 围 即 可 。 例 如 , 模 式 “ [ 0-9 ] [ 0-9 ] * ” 将 与 任 何 数 字 匹 配 , 而 模 式 “ [ A-Z ] [ A-Z ] * ” 将 与 任 何 大 小 写 字 母 匹 配 。

[ A-Z ] [ A-Z ] *we sold 9645 IBM and DEC components

[ 0-9 ] [ 0-9 ] *we bought 9645 oranges today

有 时 , 你 可 以 在 模 式 中 同 时 使 用 多 种 特 殊 字 符 ( 见 下 表 ) 。 例 如 , 模 式 “ ^

[ ^0-9 ] * ” 将 选 择 从 文 本 行 行 首 至 该 行 第 一 个 数 字 字 符 串 之 前 的 所 有 文 本 , 模式 “ [ ^0-9 ] *$ ” 将 选 择 文 本 行 上 第 一 个 数 字 字 符 串 至 该 行 行 尾 之 间 的 所 有 文本 。

^ [ ^0-9 ] * we bought 9645 oranges today

[ ^0-9 ] *$ we bought 9645 oranges today

特 殊 字 符 匹 配 方 式 操 作

^ 从 文 本 行 行 首 开 始 定 位 于 文 本 行 行 首

$ 至 文 本 行 行 尾 定 位 于 文 本 行 行 尾

. 任 意 字 符 匹 配 模 式 中 的 任 意 字 符

* 重 复 匹 配 字 符 匹 配 模 式 中 的 重 复 字 符

[ ] 字 符 类 匹 配 模 式 中 的 字 符 类 ( 字 符 集 )

grep 实 用 程 序 与 正 则 表 达 式

Shell 下 的 特 殊 字 符 可 以 让 你 搜 索 、 匹 配 文 件 名 , 而 正 则 表 达 式 允 许 你 搜 索 、匹 配 文 件 中 的 文 本 。 在 grep 命 令 中 使 用 正 则 表 达 式 , 你 可 以 用 指 定 的 模 式 来 搜索 文 件 或 匹 配 、 定 位 文 件 中 的 文 本 行 。 你 可 以 在 grep 实 用 程 序 的 搜 索 模 式 中 使用 特 殊 字 符 , 此 时 的 模 式 即 称 为 正 则 表 达 式 。 grep 正 则 表 达 式 中 可 以 使 用 的 特殊 字 符 有 “ * ”、 “ .” 、 “ [ ] ” 、 “ ^ ” 及 “ $ ” 等 。

例 如 , 如 果 你 想 使 用 列 出 文 件 详 细 信 息 格 式 的 命 令 ls 显 示 你 当 前 目 录 下 的所 有 目 录 ( 仅 仅 是 目 录 , 而 不 包 括 文 件 ) , 你 可 以 首 先 用 长 格 式 生 成 一 个 所 有目 录 及 文 件 的 列 表 , 然 后 通 过 管 道 把 该 列 表 输 入 给 命 令 grep , 通 过 该 命 令 我 们

可 以 输 出 目 录 名 列 表 。 为 只 输 出 目 录 名 列 表 , 你 可 以 使 用 特 殊 字 符 “ ^ ” 来 搜 索指 定 输 出 文 本 行 的 行 首 字 符 。 前 面 已 经 介 绍 过 , 在 以 长 格 式 方 式 命 令 ls 输 出 时 , 第 一 个 字 符 用 来 指 定 文 件 的 类 型 。 其 中 , 字 符 “ d ” 代 表 一 个 目 录 , , “ l” 代表 一 个 符 号 链 , 而 “ a ” 代 表 一 个 普 通 文 件 。 通 过 模 式 “ ^d ” , grep 命 令 将 匹配 那 些 仅 以 字 符 “ d ” 开 始 的 文 本 行 。

$ ls -l | grep '^d'

drwxr-x---

2

chris

512

Feb

10

04:30

reports

drwxr-x---

2

chris

512

Jan

6

01:30

letters

如 果 你 只 想 列 出 那 些 有 符 号 链 的 文 件 , 你 可 以 使 用 模 式 “ ^l” 。

$ ls -l | grep '^l'

lrw-rw-r-- 1 chris group 4 Feb 14 10:30 lunch

必 须 分 清 Shell 特 殊 字 符 与 搜 索 模 式 中 使 用 的 特 殊 字 符 之 间 的 区 别 。 当 你 在grep 模 式 中 使 用 特 殊 字 符 时 , 你 必 须 用 引 号 把 搜 索 模 式 括 起 来 。 必 须 注 意 , 正则 表 达 式 及 Shell 下 都 使 用 的 特 殊 字 符 有 :星 号“ * ”、句 点 号“ . ”及 方 括 号“[ ]”。如 果 你 不 用 引 号 把 正 则 表 达 式 括 起 来 , 那 么 , 模 式 中 使 用 的 任 何 特 殊 字 符 将 都将 被 解 释 为 Shell 特 殊 字 符 。 如 果 不 用 引 号 括 起 来 , 星 号 “ *” 将 被 用 来 生 成 文件 名 , 而 不 是 被 grep 实 用 程 序 用 来 解 释 为 要 搜 索 的 重 复 字 符 , 而 用 引 号 括 起 来后 , 系 统 将 确 保 grep 实 用 程 序 把 特 殊 字 符 看 作 为 正 则 表 达 式 的 一 部 分 。 在 下面 的 例 子 中 , 模 式 中 使 用 的 星 号 “ * ” 特 殊 字 符 是 正 则 表 达 式 特 殊 字 符 , 而 在 文件 列 表 参 数 中 使 用 的 星 号 “ * ” 特 殊 字 符 为 Shell 特 殊 字 符 。 此 命 令 将 搜 索 当 前目 录 下 的 所 有 文 件 , 看 这 些 文 件 中 是 否 包 含 字 符 串 “ report ” 或 其 后 面 有 任 意 个重 复 的 “ s ” 字 符 的 字 符 串 。

$ grep 'reports*' *

mydata: The report was sitting on his desk. weather:The weather repotrs were totally accurate.

特 殊 字 符 “ [ ] ” 将 指 定 一 组 匹 配 的 字 符 , 或 者 指 定 一 组 一 系 列 的 匹 配 字符 ,或 者 指 定 一 系 列 非 匹 配 的 字 符 。例 如 ,模 式“ do c[ abc ]”将 与 字 符 串“ doca ”、“ docb ” 及 “ docc ” 匹 配 , 而 不 与 字 符 串 “ docd ” 匹 配 。 该 模 式 同 样 可 以 由 一个 字 符 串 范 围 “ [ a-c ] ” 来 指 定 , 即 由 正 则 表 达 式 “ doc [ a-z ] ” 来 表 示 。 对于 模 式 “ do c[ ^ab ] ” , 它 将 匹 配 任 何 以 字 符 串 “ doc ” 开 头 , 而 不 以 字 符“ a ” 或 “ b ” 为 结 尾 的 字 符 串 , 因 此 字 符 串 “ docc ” 将 与 上 述 模 式 匹 配 , 而 字 符 串“ doca ”、 “ docb ” 不 与 其 匹 配 。

$ grep 'doc [ abc ] ' myletter File letter doca and docb.

We need to redo docc.

完 全 正 则 表 达 式 与 扩 展 特 殊 字 符 : “ |” 、 “ ( ) ” 、 “ + ” 及 “ ? ”

有 些 Linux 实 用 程 序 , 例 如 egrep 命 令 及 awk 命 令 可 以 在 它 们 的 模 式 中 使用 一 组 扩 展 特 殊 字 符 。 这 些 扩 展 特 殊 字 符 有 : “ |” 、 “ ( ) ” 、 “ + ” 及 “ ? ” 等 。 它 们 的 作 用 见 下 表 。

扩 展 特 殊 字 符 作 用

pattern | pattern 逻 辑 或 , 用 来 搜 索 两 个 可 能 的 指 定 模 式

(pattern) 用 来 搜 索 可 能 的 模 式

char + 与 其 前 一 字 符 的 1 次 或 多 次 重 复 匹 配

char ? 与 其 前 一 字 符 的 0 次 或 1 次 匹 配

其 中 , 特 殊 字 符 “ + ” 及 “ ? ” 是 星 号 “ * ” 特 殊 字 符 的 一 个 变 种 , 而 特 殊 字符 “ |” 及 “ () ” 提 供 了 新 的 功 能 。 使 用 了 上 述 扩 展 特 殊 字 符 的 模 式 称 为 完 全 正则 表 达 式 。 在 标 准 行 编 辑 器 Ed 及 Ex 中 不 能 使 用 这 些 扩 展 特 殊 字 符 , 本 节 讨 论的 实 用 程 序 中 , 只 有 egrep 及 awk 可 以 使 用 扩 展 特 殊 字 符 。

特 殊 字 符 “ + ” 将 与 单 个 字 符 的 一 个 或 该 字 符 的 任 意 次 重 复 匹 配 。 例 如 , 对于 模 式 “ t+ ” 将 至 少 与 一 个 以 上 ( 包 括 一 个 ) 的 字 符 “ t” 匹 配 , 其 功 能 与 模 式“ tt* ” 完 全 相 同 。 因 此 , 上 述 模 式 将 与 字 符 串 “ sitting” 或 字 符 串 “ bitting ” 匹配 , 但 不 与 字 符 串 “ ziing ” 匹 配 。 扩 展 特 殊 字 符 “ ? ” 将 与 指 定 字 符 的 0 次 或一 次 字 符 匹 配 。 例 如 , 由 于 “ t? ” 将 与 一 个 或 0 个 字 符 “ t” 匹 配 , 表 达 式 “ it? i” 将 与 字 符 串 “ ziing ” 或 “ biting ” 匹 配 , 但 不 与 字 符 串 “ sitting ” 匹 配 。 看 下 面的 例 子 , 要 搜 索 的 模 式 是 : 字 符 “ a ” 后 任 意 次 重 复 的 字 符 “ n ” , 然 后 跟 一 字符“ e ”。通 过 使 用 扩 展 特 殊 字 符“ + ”, 正 则 表 达 式“ an+e ”将 匹 配 由 字 符“ a ”、字 符 “ n ” 的 任 意 次 重 复 及 字 符 “ e ” 组 成 的 字 符 串 。 因 此 , 正 则 表 达 式 与 字 符串“ anew ”及“ canned ” 等 匹 配 。 在 下 面 的 第 二 个 例 子 中 , 正 则 表 达 式“ an?e ” 将 搜 索 由 字 符 “ a ” 、 0 个 或 一 个 字 符 “ n ” 及 字 符 “ e ” 组 成 的 字 符 串 , 因 此 , 该 表 达 式 将 与 “ ane ” 与 “ anew ” 匹 配 , 而 不 与 字 符 窜 “ canned ” 匹 配 。

an+e anew canned an?e anew

canned 不 匹 配

扩 展 特 殊 字 符 “ | ” 与 “ ( ) ” 主 要 用 来 对 模 式 块 起 作 用 , 而 不 是 只 对 字 符起 作 用 。 特 殊 字 符 “ |” 是 一 个 逻 辑 或 特 殊 字 符 , 用 来 在 一 个 正 则 表 达 式 中 指 定多 个 要 搜 索 的 字 符 串 。 尽 管 这 些 字 符 串 是 这 个 正 则 表 达 式 的 一 部 分 , 但 它 们 是被 作 为 相 对 独 立 的 字 符 串 来 搜 索 的 。 例 如 正 则 表 达 式 “ create | stream ” 可 以用 来 搜 索 字 符 串 “ create ” 或 字 符 串 “ stream ” 。

create | stream

consists of a stream of be used to create such

egrep 实 用 程 序 综 合 了 实 用 程 序 grep 与 fgrep 的 功 能 。 与 fgrep 命 令 一 样 , egrep 命 令 可 以 同 时 搜 索 多 个 模 式 ; 同 时 , 与 grep 命 令 一 样 , egrep 命 令 可 以在 搜 索 时 使 用 特 殊 字 符 及 使 用 正 则 表 达 式 进 行 搜 索 。 但 是 , 与 grep 命 令 又 有 所不 同 , 在 用 egrep 命 令 进 行 搜 索 时 , 可 以 在 搜 索 模 式 中 使 用 扩 展 特 殊 字 符 , 如逻 辑 或 操 作 等 。 因 此 , 可 以 这 么 说 , egrep 命 令 是 上 述 三 个 过 滤 器 搜 索 实 用 程序 中 功 能 最 强 大 的 一 个 。

为 了 一 次 搜 索 多 个 模 式 , 你 可 以 在 命 令 行 上 输 入 要 搜 索 的 模 式 , 并 用 换 行

字 符 把 它 们 分 割 开 ( fgrep 命 令 就 是 如 此 ) , 也 可 以 在 一 个 正 则 表 达 式 中 使 用 逻辑 或 “ |” 特 殊 字 符 来 指 定 多 个 搜 索 的 模 式 。 尽 管 这 些 搜 索 的 模 式 实 际 上 只 是 一个 正 则 表 达 式 的 一 部 分 , 但 它 们 在 搜 索 时 都 是 相 互 独 立 的 模 式 。 例 如 , 对 于 模式 “ create | stream ” , egrep 将 搜 索 模 式 “ create ”或 “ stream ” 。

$ egrep 'create | stream' preface consists of a stream of

be used to create such

特 殊 字 符 组 可 以 用 来 帮 助 你 精 确 指 定 你 所 要 搜 索 的 模 式 。 例 如 , 如 果 你 要列 出 在 6:00a.m .与 12:00p.m .之 间 更 新 的 所 有 文 件 , 如 果 你 只 是 使 用 特 殊 字 符类 指 定 的 模 式 “ [ 01 ] [ 6-90-2 ] ” 来 进 行 模 式 匹 配 , 那 么 , 你 将 不 仅 匹 配 到字 符 串 “ 12 ” , 而 且 匹 配 到 字 符 串 “ 02 ” ; 不 仅 匹 配 到 字 符 串 “ 06 ” , 而 且 匹配 到 字 符 串 “ 16 ” 。 但 是 , 使 用 字 符 组 与 特 殊 字 符 “ |” , 你 可 以 解 决 上 述 问 题 。正 则 表 达 式“( 0[ 6-9 ]| 1[ 0-2 ])”将 成 功 地 匹 配 到 你 在 6:00a.m .与 12:00p.m. 之 间 更 新 的 所 有 文 件 ( 详 见 下 面 的 例 子 ) 。

$ ls -l | egrep '(0 [ 6-9 ] | 1 [ 0-2 ] ):.*$'

-rw-r--r--1chris weather 207Jan 2710:55forecast

-rw-rw-r-- 1chris weather 308 Feb 1712:40monday

-rw-r--r-x 1chris weather 789 Feb 0606:45roster

-rw-rw-r-x 1chris weather 942 Feb 1208:20strom

本 章 小 结 : 过 滤 器

过 滤 器 接 收 标 准 输 入 输 入 的 数 据 , 经 过 相 应 的 操 作 , 然 后 再 输 出 经 过 “ 过滤 ” 后 的 数 据 ( 原 始 数 据 并 不 会 被 修 改 ) , 有 三 种 常 见 的 过 滤 器 : 文 件 过 滤 器 、编 辑 过 滤 器 及 数 据 过 滤 器 。 文 件 过 滤 器 主 要 用 来 对 文 件 执 行 一 些 基 本 的 操 作 , 如 搜 索 、 显 示 文 件 中 匹 配 的 模 式 。 编 辑 过 滤 器 主 要 用 来 执 行 编 辑 操 作 。 数 据 过滤 器 主 要 用 来 修 改 、 处 理 文 件 中 的 数 据 域 。 所 有 这 些

过 滤 器 可 以 使 用 正 则 表 达 式 来 执 行 功 能 强 大 的 模 式 匹 配 操 作 。 尽 管 有 很 多过 滤 器 把 文 件 名 作 为 它 们 的 参 数 , 但 所 有 的 过 滤 器 都 以 标 准 输 入 作 为 其 输 入 数

据 。 这 些 过 滤 器 也 允 许 你 使 用 管 道 把 一 个 过 滤 器 的 输 出 数 据 输 入 到 另 一 个 过 滤器 。 在 命 令 行 上 , 你 可 以 键 入 一 系 列 的 过 滤 器 命 令 , 并 把 其 前 一 个 过 滤 器 输 出的 数 据 作 为 下 一 个 过 滤 器 命 令 的 输 入 。 从 这 种 意 义 上 说 , 一 个 输 入 的 数 据 可 以被 传 递 给 几 个 过 滤 器 。 在 传 递 这 一 数 据 的 过 程 中 , 每 一 个 过 滤 器 在 输 出 数 据 、传 递 给 下 一 个 过 滤 器 时 都 会 作 必 要 的 修 改 。

根 据 过 滤 器 的 功 能 不 同 , 它 们 可 以 生 成 各 种 各 样 的 输 出 。 有 些 过 滤 器 仅 生成 一 些 简 单 的 统 计 数 据 , 如 wc 命 令 仅 输 出 文 件 中 的 字 符 数 、 单 词 或 文 本 行 数 。另 外 一 些 过 滤 器 有 选 择 性 的 输 出 部 分 输 入 的 文 本 。 例 如 , spell 命 令 将 仅 输 出 有拼 写 错 误 的 单 词 ; head 命 令 仅 输 出 文 件 的 头 部 的 部 分 文 本 行 , 而 tail 命 令 仅 输出 文 件 尾 部 的 部 分 文 本 行 ; 命 令 diff 命 令 将 输 出 两 文 件 的 文 本 行 之 间 的 差 别 。还 有 另 外 一 些 过 滤 器 输 出 所 有 其 输 入 的 文 本 , 但 输 出 的 是 经 过 部 分 修 改 后 的 文本 。 pr 命 令 将 以 页 面 格 式 在 文 件 中 标 明 页 眉 与 页 号 , 而 sort 命 令 将 输 出 经 过 排序 后 的 文 本 。

大 多 数 的 过 滤 器 都 有 一 组 选 项 , 这 些 选 项 可 以 使 你 进 一 步 选 择 、 修 改 过 滤器 输 出 数 据 的 方 式 。例 如 ,带 -n 选 项 的 命 令 pr 可 以 输 出 带 行 号 的 文 本 ,而 带 -num 选 项 ( num 为 一 个 数 字 类 型 的 参 数 ) 的 tail 命 令 将 允 许 你 输 出 至 文 件 结 尾 处 的num 行 文 本 。

文 件 过 滤 器

文 件 过 滤 器 用 来 对 文 件 执 行 一 些 基 本 的 操 作 , 例 如 用 来 显 示 、 编 辑 文 件 内容 、 搜 索 文 件 中 的 模 式 、 生 成 格 式 化 文 本 及 备 份 文 件 等 。 例 如 , 命 令 cat、 head 及 tail 过 滤 器 命 令 用 来 显 示 文 件 。 其 中 , cat 命 令 用 来 显 示 这 个 文 件 的 内 容 , 而

head 命 令 用 来 列 出 文 件 的 头 几 行 , tail 命 令 用 来 列 出 文 件 的 最 后 几 行 。 tail 命 令有 一 些 选 项 , 通 过 这 些 选 项 , 你 可 以 选 择 要 显 示 多 少 行 至 文 件 尾 的 文 本 及 怎 样显 示 这 些 文 本 。

过 滤 器 命 令 cmp 及 comm 命 令 用 来 比 较 文 件 。 cmp 过 滤 器 用 来 对 字 符 进 行逐 个 比 较 , 并 输 出 行 号 及 第 一 个 不 相 同 的 字 符 。 comm 过 滤 器 用 来 对 文 本 行 进行 逐 行 比 较 , 并 输 出 两 个 文 件 中 相 同 的 文 本 行 及 不 相 同 的 文 本 。 grep 命 令 用 来搜 索 文 件 中 特 定 的 模 式 。 你 可 以 用 该 命 令 同 时 搜 索 多 个 文 件 , 该 命 令 将 分 别 输出 文 件 名 及 该 文 件 中 与 模 式 匹 配 的 文 本 行 或 行 号 。 grep 命 令 也 有 几 个 选 项 , 例如 , -n 选 项 将 在 输 出 匹 配 的 文 本 行 的 同 时 输 出 行 号 。

pr 命 令 用 来 输 出 一 个 或 多 个 格 式 化 的 文 本 。 pr 命 令 也 有 多 个 选 项 , 例 如 , 使 用 -h 选 项 , 你 可 以 给 输 出 的 文 件 指 定 一 个 页 眉 ; 使 用 -w 选 项 , 你 可 以 在 文 本中 添 加 页 码 。pr 命 令 的 一 个 非 常 有 用 的 选 项 是 可 以 用 -n 选 项 来 输 出 文 本 行 行 号 。该 选 项 与 -t 选 项 ( 禁 止 添 加 页 眉 ) 一 起 可 以 用 来 生 成 一 个 简 单 的 、 带 行 号 的 格式 化 文 本 。

你 可 以 用 cpio 命 令 来 管 理 备 份 的 文 件 。 通 过 该 命 令 , 你 可 以 把 一 个 文 件 拷贝 到 档 案 ( archive ) 格 式 文 件 中 去 , 必 要 时 , 你 可 以 再 展 开 该 文 件 。 cpio 命 令并 不 直 接 存 取 该 文 件 , 只 是 通 过 重 定 向 操 作 来 读 取 或 保 存 一 个 档 案 。 cpio 命 令有 两 个 重 要 的 选 项 , 其 中 , -i 选 项 用 来 保 存 档 案 , 而 -o 选 项 用 来 展 开 文 件 。 你也 可 以 把 目 录 及 其 文 件 保 存 到 一 个 档 案 文 件 中 , 但 你 首 先 必 须 用 find 命 令 搜 索你 当 前 目 录 下 所 有 文 件 的 全 路 径 名 , 然 后 通 过 管 道 操 作 把 这 些 文 件 备 份 到 档 案文 件 中 。

编 辑 过 滤 器

Linux 系 统 中 的 文 本 文 件 是 以 行 为 单 位 来 组 织 文 件 的 。 许 多 编 辑 实 用 程 序 , 如 行 编 辑 器 及 编 辑 过 滤 器 等 , 都 把 文 件 看 作 是 一 系 列 的 文 本 行 来 进 行 定 位 与 编辑 的 。 所 有 的 编 辑 器 都 有 一 组 核 心 行 编 辑 命 令 , 并 通 过 这 组 命 令 对 文 本 行 上 的文 本 进 行 各 种 编 辑 操 作 。 文 件 中 的 文 本 是 通 过 行 来 定 位 的 , 因 此 , 我 们 可 以 用行 号 或 通 过 模 式 匹 配 来 定 位 文 本 行 ( 即 通 过 定 位 文 本 行 中 的 搜 索 文 本 来 定 位 文本 行 ) 。 对 于 一 些 特 定 的 文 本 行 , 我 们 还 可 以 使 用 特 殊 行 定 位 符 来 定 位 它 们 , 例 如 , 字 符 “ $ ” 用 来 定 位 于 文 件 的 最 后 一 行 , 字 符 “ .” 用 来 定 位 当 前 行 。 在一 些 行 编 辑 器 中 , 如 Ed 编 辑 器 , 字 符 “ + ” 用 来 定 位 当 前 行 的 下 一 行 , 字 符“ -” 用 来 定 位 当 前 行 的 上 一 行 。 同 时 , 你 还 可 以 在 k 命 令 后 跟 单 个 字 符 来 标 识 当 前文 本 行 , 然 后 你 可 以 在 该 标 识 的 字 符 之 前 键 入 单 引 号 来 定 位 上 述 标 识 的 文 本 。

当 你 定 位 到 文 本 行 后 , 你 可 以 用 行 编 辑 命 令 来 在 文 本 行 上 输 入 文 本 、 删 除文 本 或 替 换 文 本 , 同 时 , 你 还 可 以 移 动 或 拷 贝 文 本 行 。 如 果 你 想 在 文 本 行 上 修改 指 定 的 文 本 , 那 么 , 你 可 以 使 用 文 本 替 换 命 令 , 该 命 令 可 以 让 你 用 一 个 指 定的 文 本 去 替 换 另 一 个 指 定 的 文 本 。 需 注 意 的 是 , 该 指 定 的 文 本 既 是 被 用 来 搜 索的 文 本 , 也 是 将 被 替 换 的 文 本 。

tr、 diff 及 sed 命 令 用 来 对 输 入 数 据 进 行 编 辑 操 作 , 而 这 些 输 入 数 据 是 从 标准 输 入 上 读 取 的 。 它 们 用 来 对 输 入 的 文 本 文 件 进 行 编 辑 , 并 生 成 相 应 文 件 的 修改 版 。 这 些 过 滤 器 编 辑 命 令 可 以 从 文 件 或 标 准 输 入 上 接 收 数 据 的 输 入 , 经 过 一定 的 修 改 后 , 再 输 出 编 辑 后 的 输 入 。 你 可 以 用 重 定 向 操 作 把 将 要 输 出 的 数 据 保存 到 一 个 文 件 或 输 出 到 一 个 设 备 上 如 打 印 机 等 。

sed 命 令 实 际 上 是 一 个 流 式 行 编 辑 器 , 该 编 辑 器 通 过 行 编 辑 命 令 对 输 入 的数 据 进 行 编 辑 , 并 产 生 输 入 数 据 的 修 改 版 。 但 是 , 与 大 多 数 编 辑 器 不 同 , sed 编 辑 器 的 比 较 命 令 在 缺 省 条 件 下 是 全 局 命 令 , 但 你 可 以 使 用 模 式 或 行 号 来 严 格限 制 编 辑 命 令 的 操 作 范 围 。 例 如 , 在 sed 编 辑 命 令 之 前 输 入 搜 索 模 式 这 一 选 项 , 则 这 些 命 令 将 被 严 格 限 制 在 与 搜 索 模 式 相 匹 配 的 文 本 行 上 。

diff 命 令 用 来 比 较 两 个 文 件 , 然 后 输 出 两 文 件 中 有 差 别 的 文 本 行 。 该 命 令 可以 详 细 地 输 出 文 件 的 编 辑 信 息 , 以 帮 助 用 户 经 过 怎 样 的 修 改 可 以 把 第 一 个 文 件变 成 与 第 二 个 文 件 完 全 相 同 的 文 件 。 带 -e 选 项 的 diff 命 令 可 以 输 出 行 编 辑 命 令 , 通 过 这 些 行 编 辑 命 令 , 你 可 以 把 第 一 个 文 件 修 改 成 第 二 个 文 件 的 一 个 精 确 拷 贝 , 即 把 第 一 个 文 件 修 改 成 与 第 二 个 文 件 完 全 相 同 的 文 件 。

tr 命 令 可 以 转 换 输 入 数 据 流 中 的 指 定 字 符 。 它 可 以 用 两 个 指 定 的 字 符 列 表特 殊 执 行 几 个 字 符 转 换 操 作 。 执 行 该 命 令 时 , 第 一 个 字 符 列 表 中 的 字 符 被 转 换成 第 二 个 字 符 列 表 中 对 应 的 字 符 。 tr 命 令 也 有 一 些 选 项 , 这 些 选 项 可 以 使 你 删除 或 替 换 输 入 数 据 中 重 复 的 字 符 。 tr 命 令 一 个 常 见 的 应 用 是 对 文 件 进 行 简 单 的加 密 。

正 则 表 达 式

在 进 行 文 本 搜 索 的 时 候 , 有 时 你 需 要 功 能 更 强 大 、 使 用 更 灵 活 的 模 式 来 进行 模 式 搜 索 。 许 多 有 编 辑 能 力 的 实 用 程 序 在 进 行 模 式 搜 索 的 时 候 都 可 以 使 用 一组 标 准 的 特 殊 字 符 , 如 果 一 个 搜 索 模 式 中 包 含 这 些 特 殊 字 符 , 那 么 , 我 们 称 该搜 索 模 式 为 正 则 表 达 式 。 尽 管 有 些 特 殊 字 符 与 Shell 下 的 一 些 特 殊 字 符 相 同 , 但 它 们 的 功 能 是 不 同 的 。 正 则 表 达 式 中 的 特 殊 字 符 是 用 来 搜 索 文 本 的 , 而 Shell

下 的 搜 索 匹 配 的 文 件 名 的 。

用 正 则 表 达 式 特 殊 字 符 , 你 可 以 定 位 文 本 行 的 行 首 或 行 尾 ( 字 符 “ $ ” 及 字符 “ ^ ” ) ; 可 以 匹 配 一 个 字 符 的 任 意 次 重 复 ( 字 符 “ * ” ) ; 可 以 匹 配 任 意 的字 符 或 字 符 集 中 任 意 可 能 的 字 符 ( 字 符 “ .” 及 字 符 “ [ ” 、 “ ] ” ) 。 你 会 发现 , 很 多 具 有 编 辑 能 力 的 实 用 程 序 都 可 以 使 用 正 则 表 达 式 。 还 有 一 些 实 用 程 序如 sed 命 令 及 awk 命 令 可 以 在 正 则 表 达 式 中 使 用 扩 展 特 殊 字 符 。

特 殊 字 符 只 有 在 模 式 中 才 具 有 特 殊 的 意 义 , 而 在 模 式 之 外 , 它 们 可 能 代 表不 同 的 意 义 , 或 者 仅 仅 是 一 个 普 通 的 字 符 。 例 如 , 符 号 “ $ ” 在 行 编 辑 器 中 用 来定 位 文 件 的 最 后 一 行 , 在 模 式 中 , 特 殊 字 符 “ $ ” 用 来 定 位 文 本 行 行 尾 , 而 在 替换 命 令 中 , 符 号 “ $ ” 仅 仅 是 一 个 普 通 的 字 符 。

对 于 替 换 命 令 , 替 换 文 本 有 其 自 己 的 一 组 特 殊 字 符 , 你 可 以 用 这 组 特 殊 字符 来 “ 构 造 ” 替 换 的 文 本 。 如 果 想 在 搜 索 模 式 或 替 换 文 本 中 使 用 特 殊 字 符 , 你可 以 用 反 斜 扛 “ \ ” 来 引 用 一 个 特 殊 字 符 。 例 如 , 如 果 要 搜 索 一 个 包 含 特 殊 字符 “ .” 的 模 式 , 你 必 须 用 反 斜 扛 符 号 “ \ ” 来 引 用 该 字 符 , 即 用 符 号 “ \ .” 来表 示 。

命 令 grep 用 来 在 文 件 中 执 行 模 式 搜 索 , 并 输 出 那 些 包 含 搜 索 模 式 的 文 本 行 。grep 命 令 有 很 多 选 项 , 你 可 以 用 这 些 选 项 来 决 定 是 否 输 出 文 本 行 行 号 , 或 者 是输 出 文 件 中 匹 配 的 文 本 行 还 是 非 匹 配 的 文 本 行 。grep 命 令 有 两 个 变 种 命 令 :fgrep 及 egrep 命 令 。 正 如 在 第 8 章 中 指 出 的 那 样 , fgrep 命 令 可 以 同 时 搜 索 多 个 模式 , 但 该 命 令 不 允 许 在 搜 索 的 模 式 中 使 用 特 殊 字 符 。 egrep 命 令 也 可 以 同 时 搜索 多 个 模 式 , 但 它 允 许 在 搜 索 的 模 式 中 使 用 特 殊 字 符 。 事 实 上 , egrep 命 令 也允 许 使 用 扩 展 特 殊 字 符 , 如 “ |” 、 “ + ” 及 “ ? ” 等 。

数 据 过 滤 器

Linux 系 统 中 还 有 一 组 过 滤 器 命 令 , 它 们 可 以 对 输 入 数 据 流 执 行 各 种 数 据 操作 。 这 组 数 据 过 滤 器 命 令 与 其 它 过 滤 器 一 样 , 首 先 接 收 数 据 输 入 , 然 后 对 输 入的 数 据 流 执 行 各 种 操 作 , 最 后 输 出 经 过 各 种 操 作 ( 如 修 改 ) 后 的 数 据 。 有 些 文件 的 文 本 类 似 于 数 据 库 文 件 , 它 们 以 数 据 域 的 形 式 组 织 文 本 : 文 件 中 的 每 个 文本 行 都 是 一 个 记 录 , 而 文 件 行 上 的 每 个 单 词 都 是 该 记 录 的 数 据 域 。 数 据 过 滤 器命 令 就 是 针 对 这 类 文 件 设 计 的 。 数 据 过 滤 器 命 令 把 包 含 这 种 记 录 的 文 件 作 为 其输 入 , 然 后 用 给 定 的 评 判 标 准 输 出 选 择 的 记 录 。

有 五 个 数 据 过 滤 器 命 令 , 它 们 是 sort 命 令 、 cut 命 令 、 paste 命 令 、 join 命令 及 uniq 命 令 ( 见 表 14-3 )。 sort 命 令 用 来 对 文 件 中 的 所 有 记 录 进 行 排 序 ( 如对 指 定 的 字 段 按 字 母 顺 序 进 行 排 序 ) , 并 生 成 记 录 排 序 后 的 文 件 。 sort 命 令 当然 也 可 以 对 任 意 的 文 本 文 件 的 文 本 行 进 行 排 序 。

cut 命 令 输 出 数 据 文 件 中 所 有 选 择 的 字 段 。 paste 命 令 能 够 合 并 几 个 数 据 文件 中 的 记 录 , 并 输 出 合 并 后 的 记 录 。 join 命 令 首 先 比 较 两 个 文 件 中 指 定 字 段 的值 , 再 合 并 这 两 个 文 件 中 相 应 的 记 录 , 最 后 输 出 这 些 合 并 后 的 记 录 。 uniq 命 令用 来 确 定 那 些 值 相 同 的 字 段 , 该 命 令 可 以 用 来 统 计 文 件 中 有 多 少 字 段 的 值 相 同 , 也 可 以 在 输 出 数 据 时 用 该 命 令 来 删 除 文 件 中 所 有 重 复 的 字 段 。

尽 管 上 述 数 据 过 滤 器 命 令 不 能 执 行 专 业 数 据 库 管 理 软 件 中 那 些 复 杂 的 数 据库 操 作 , 但 是 你 会 发 现 它 们 还 是 可 以 执 行 专 业 数 据 库 管 理 软 件 中 一 些 常 见 的 数据 库 操 作 。 例 如 , 你 可 以 进 行 数 据 排 序 、 选 择 显 示 的 字 段 , 你 也 可 以 有 选 择 性的 恢 复 不 同 文 件 中 匹 配 的 记 录 , 你 甚 至 还 可 以 用 多 个 数 据 过 滤 器 命 令 来 完 成 复杂 的 数 据 查 询 、 排 序 操 作 。 例 如 , 你 可 以 用 join 命 令 合 并 从 不 同 文 件 中 选 择 的

记 录 , 然 后 通 过 管 道 把 合 并 后 的 记 录 输 出 至 sort 命 令 , 以 对 合 并 后 的 记 录 进 行排 序 。

表 14-1 文 件 过 滤 器 命 令

命 令

功 能

cat filename

显 示 一 个 文 件 的 内 容 , 它 用 文 件 名 作 为 其 参 数 , 并

直 接 把 文 件 的 内 容 输 出 到 标 准 输 出 上 , 其 缺 省 的 标

准 输 出 是 屏 幕

tee filename

在 把 标 准 输 入 输 出 到 标 准 输 出 的 同 时 把 它 拷 贝 到 一

个 或 多 个 文 件 中 。 该 命 令 通 常 与 另 一 个 过 滤 器 命 令

一 起 使 用 , 从 而 在 把 输 出 数 据 送 到 另 一 个 过 滤 器 或

实 用 程 序 的 同 时 保 存 该 输 出 数 据

head filename

显 示 一 个 文 件 的 头 几 行 , 缺 省 值 是 后 十 行 , 但 是 ,

你 可 以 指 定 你 要 显 示 的 文 本 行 行 数

tail [ +/-num

显 示 一 个 文 件 的 最 后 几 行 ,缺 省 值 是 前 十 行 ,但 是 ,

[ options] filename

你 可 以 指 定 你 要 显 示 的 文 本 行 行 数

选 项 :

-num

用 num 参 数 来 显 示 指 定 要 显 示 的 文 本 行 行 数 ( 从 文

件 尾 部 向 前 计 算 ) 。

+num

显 示 页 号 为 num 以 后 的 所 以 文 本

-c

以 字 符 数 来 显 示 文 本 。 该 选 项 与 -num 或 者 +num 选

项 同 时 使 用 时 , num 表 示 要 显 示 的 字 符 数

-l

以 文 本 行 行 数 来 显 示 文 本 。该 选 项 与 -num 或者 +num

选 项 同 时 使 用 时 , num 表 示 要 显 示 的 文 本 行 行 数 , 为 缺 省 选 项

-r 以 反 序 显 示 文 本 行 。 该 选 项 与 -num 或 者 +num 选 项同 时 使 用 时 , num 表 示 要 以 反 序 显 示 的 文 本 行 行 数 。

+lr 表 示 以 反 序 显 示 所 有 的 文 本 行

wc filename 统 计 并 输 出 文 件 中 包 含 的 行 数 、 单 词 数 及 字 符 数选 项 :

c 只 统 计 文 件 中 的 字 符 数

l 只 统 计 文 件 中 的 行 数

w 只 统 计 文 件 中 的 单 词 数

spell filename 检 查 文 件 中 每 个 单 词 的 拼 写 情 况 , 并 只 输 出 那 些 有

拼 写 错 误 的 单 词

+filename 该 选 项 可 以 用 你 自 己 所 定 义 的 词 汇 来 检 查 文 件 中 的拼 写 错 误

sort filename 输 出 经 过 排 序 后 的 文 件 内 容

comm filename filename

grep [ options ]

pattern filenames

选 项 :

逐 行 比 较 两 个 文 件 的 内 容 , 并 根 据 两 文 件 文 本 行 的内 容 输 出 它 们 之 间 的 差 别

搜 索 一 个 或 多 个 文 件 中 与 指 定 模 式 匹 配 的 字 符 串 , 并 列 出 该 字 符 串 所 在 的 文 本 行

I 忽 略 大 小 写

C 只 输 出 每 个 文 件 中 包 含 匹 配 模 式 的 行 的 数 目

L 显 示 每 个 包 含 有 一 处 或 多 处 与 搜 索 模 式 匹 配 的 文 件名

N 在 每 个 匹 配 的 文 本 行 前 面 加 上 该 行 在 文 件 中 的 行 号

V 输 出 那 些 所 有 不 包 含 搜 索 模 式 的 文 本 行

fgrep [ options ]

patterns flle-list

选 项 :

同 时 用 多 个 模 式 去 搜 索 文 件 名 列 表 中 所 有 文 件 。 该命 令 的 运 行 速 度 要 比 grep 及 egrep 命 令 要 快 。但 是 , 不 能 在 搜 索 模 式 中 使 用 特 殊 字 符 , 也 就 是 不 能 搜 索正 则 表 达 式

-f filename 如 果 有 该 选 项 , fgrep 命 令 将 从 文 件 名 为 filename

的 文 件 中 读 取 所 有 要 搜 索 的 模 式 。

egrep [ options ]

patterns file-list

用 模 式 搜 索 文 件 列 表 中 的 所 有 文 件 。 与 fgrep 命 令一 样 , 它 也 可 以 从 文 件 中 读 取 要 搜 索 的 模 式 列 表 , 与 grep 命 令 一 样 , 在 搜 索 模 式 中 可 以 使 用 正 则 表 达式 ( 即 可 以 使 用 特 殊 字 符 ) , 与 grep 命 令 的 不 同 之处 在 于 egrep 命 令 可 以 使 用 扩 展 特 殊 字 符 , 如 : ? 、

|、 + 等 。

Pr 输 出 格 式 化 后 的 文 本 , 包 括 添 加 页 码 、 页 眉 及 其 它指 定 的 格 式 化 方 式 。

cpio -o > archive-file cpio -i > filenames

< archive-file 把 文 件 拷 贝 到 档 案 文 件 中 , 或 从 档 案 文 件 中 释 放 已

备 份 的 文 件 。 该 命 令 有 两 种 操 作 方 式 : 一 种 是 使 用 -

o 选 项 把 文 件 拷 贝 到 档 案 文 件 中 去 , 另 一 个 选 项 是使 用 -i 选 项 从 档 案 文 件 中 释 放 已 经 备 份 了 的 文 件 。当 要 把 文 件 拷 贝 到 档 案 文 件 中 时 , 你 可 以 首 先 用 ls 命 令 或 find 命 令 生 成 文 件 名 列 表 。

表 14-2 编 辑 过 滤 器 命 令

命 令 功 能

sed editing-command file-list

选 项 :

输 出 经 过 编 辑 修 改 后 的 文 件 。 sed 命 令 以 编 辑 命 令及 文 件 名 列 表 作 为 其 参 数 。 编 辑 命 令 对 从 文 件 名 列表 中 读 取 的 数 据 进 行 编 辑 操 作 , 然 后 输 出 经 过 修 改后 的 文 件 拷 贝 。 命 令 行 上 的 编 辑 命 令 参 数 与 Ed 行编 辑 器 中 使 用 的 命 令 相 同 。

-n 用 该 选 项 , sed 命 令 不 会 自 动 输 出 文 本 行 。 该 选 项通 常 与 打 印 命 令 一 起 使 用 , 以 便 仅 输 出 选 择 的 文 本行 。

  1. filename 如 果 有 该 选 项 , sed 命 令 将 从 指 定 的 文 件 中 读 取 编

辑 命 令 。

A 在 下 一 文 本 行 后 添 加 文 本

I 在 前 一 文 本 行 上 添 加 文 本

  1. 修 改 文 本

  2. 删 除 文 本

P 打 印 文 本

W 把 文 本 行 写 到 一 个 文 件 中 去

R 从 文 件 中 读 取 文 本 行

Q 修 改 后 退 出 sed 编 辑 器

N 跳 至 下 一 行

s/pattern/replacement 用 replacement 文 本 去 搜 索 替 换 文 件 中 匹 配 的 模 式

  1. s/pat/rep/g 在 文 本 行 上 进 行 全 局 替 换

p s/pat/rep/p 输 出 修 改 后 的 文 本 行

w s/pat/rep/w fname

/pattern/

把 修 改 后 的 文 本 行 写 入 文 件 , 要 写 入 的 文 本 行 可 以用 一 个 模 式 去 搜 索 与 定 位

diff filename filename 逐 行 比 较 两 个 文 件 之 间 的 差 异 , 并 输 出 有 差 异 的 文

本 行 及 怎 样 修 改 这 些 差 异 的 指 令 , 通 过 这 些 信 息 , 你 可 以 将 第 一 个 文 件 修 改 为 与 第 二 个 文 件 完 全 相 同的 文 件

f1-linenum a f2-line1, f2-line2

f1-line1,f1-line2 c f2- line1,f2-line2

把 文 件 f2 中 的 f2-line1 与 f2-line2 之 间 的 所 有 文 本添 加 到 文 件 f1 的 第 f1-linenum 行 之 后 f1-line1,f1- line2 d f1-linenum 删 除 文 件 f1 中 f1-line1 与 f1-line2 之 间 的 所 有 文 本

用 f2 文 件 中 f2-line1 与 f2-line2 之 间 的 文 本 去 替 换文 件 f1 中 f1-line1 与 f1-line2 之 间 的 所 有 文 本

选 项 :

  1. 忽 略 空 格 及 制 表 符

  2. 输 出 不 同 文 本 行 的 上 下 行 文 本 。 其 缺 省 值 是 输 出 不同 文 本 行 的 上 下 三 行 文 本

e 输 出 一 组 Ed 编 辑 器 比 较 命 令 列 表 , 通 过 这 些 命 令 , 你 可 以 把 第 一 个 文 件 修 改 成 与 第 二 个 文 件 完 全 相 同的 文 件

tr first-character- listsecond-character- list

选 项 :

把 输 入 文 件 中 所 有 出 现 的 第 一 个 字 符 列 表 中 的 字 符用 第 二 个 字 符 列 表 中 的 字 符 代 替

[ ] 指 定 一 系 列 字 符

d 用 该 选 项 , tr 将 删 除 输 入 数 据 中 任 何 包 含 在 字 符 列表 中 的 任 何 字 符

c 替 换 那 些 不 在 字 符 列 表 中 的 字 符

s 删 除 文 件 中 重 复 的 字 符

表 14-3 数 据 过 滤 器 命 令

命 令 功 能

sort -option file-list 对 输 入 的 数 据 以 行 为 单 位 进 行 排 序 , 以 生 成 一 个 经

过 排 序 后 的 文 件 。 你 可 以 以 字 母 为 序 进 行 排 序 ( 顺序 或 反 序 排 序 ) , 或 执 行 数 字 排 序 。

选 项 :

-o filename 把 sort 命 令 的 输 出 保 存 到 文 件 filename 中 。 你 可 以

使 用 该 选 项 来 安 全 地 覆 盖 原 文 件 , 生 成 一 个 经 过 排序 后 的 文 件 。

C 检 查 该 文 件 是 否 是 经 过 排 序 后 的 文 件 。 如 果 该 文 件是 没 排 序 的 文 件 , sort 命 令 将 显 示 一 个 错 误 信 息 , 否 则 , 它 不 显 示 任 何 信 息 。

M 合 并 已 经 排 序 后 的 文 件 。

U 对 于 重 复 的 行 , 该 选 项 将 仅 输 出 一 次

D 该 选 项 不 理 睬 所 有 非 字 母 、 数 字 符 或 空 白 字 符 , 即以 字 母 表 顺 序 进 行 排 序

F 忽 略 大 小 写

I 忽 略 非 打 印 字 符

  1. 按 月 名 排 序 , 该 选 项 将 排 序 月 份 字 段

  2. 按 字 段 的 算 术 值 进 行 排 序 , 而 不 是 按 字 符 顺 序

R 以 反 序 进 行 排 序

B 忽 略 字 段 前 的 空 白 字 符

+num 文 本 行 上 需 要 忽 略 的 字 段 , 即 对 所 有 行 的 第 num 个字 段 的 下 一 字 段 进 行 排 序 , 如 +2 将 忽 略 前 两 个 字段 , 而 对 所 有 文 本 行 的 第 三 个 字 段 进 行 排 序

-num 使 sort 命 令 在 第 num 个 字 段 前 停 止 排 序

-tc 指 定 一 个 新 的 分 割 符 , 如 字 符 “ c ” , 缺 省 的 字 符 是

空 格

paste -option file-list 把 不 同 文 件 中 的 文 本 行 合 并 , 然 后 输 出 它 们

-d delimiter-list 你 可 以 用 你 自 己 指 定 的 字 符 作 为 定 界 符 , 以 分 离 合

并 后 的 文 本 行

cut -option file-list 拷 贝 文 件 中 指 定 的 字 段 或 指 定 的 字 段 列 。 在 使 用 cut

命 令 的 过 程 中 , 你 必 须 使 用 -f 选 项 或 -c 选 项

选 项 :

-fnum 指 定 你 要 从 文 件 中 拷 贝 出 的 字 段 , 字 段 从 1 开 始 计算

-fnum1,num2 指 定 要 拷 贝 的 字 段

-fnum1-num2 指 定 从 num1 开 始 至 num2 的 一 系 列 字 段

-cnum-num 指 定 要 拷 贝 的 一 列 字 符

-ddelimiter-list 指 定 自 己 的 定 界 符

join -option file-list uniq option input-file output-file

选 项 :

排 除 输 入 数 据 中 重 复 的 文 本 行 。 你 也 可 以 比 较 选 定字 段 来 排 除 选 定 域 中 相 同 的 文 本 行 ( 此 时 , 如 果 选定 的 字 段 相 同 , 那 么 , 该 命 令 认 为 这 些 文 本 行 是 重复 行 ) 。

  1. 使 用 该 选 项 , uniq 命 令 将 输 出 文 本 中 重 复 的 文 本 行 , 同 时 在 该 行 的 文 本 行 的 前 面 显 示 重 复 的 次 数

  2. 使 用 该 选 项 , uniq 命 令 将 仅 输 出 重 复 的 文 本 行

u 使 用 该 选 项 , uniq 命 令 将 仅 输 出 非 重 复 的 文 本 行

-num 在 进 行 比 较 时 需 要 忽 略 的 字 段 数 , 只 比 较 剩 下 的 字

+num 在 进 行 比 较 时 需 要 忽 略 的 字 符 数 , 只 比 较 剩 下 的 字符