IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Linux  >

技巧: 用 cat 合并文件

认识您的文本实用程序

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

Jacek Artymiak (jacek@artymiak.com), 自由顾问、开发人员和作家

2002 年 10 月 09 日

在我们有关 GNU 文本实用程序的连续系列中,Jacek Artymiak 对 cat 做了一下研究 — cat 这个命令是 UNIX 爱好者所热爱的,也是厌恶 UNIX 的人所憎恶的。

您常常需要将几个文件处理成一个文件并将这种处理的结果保存到一个单独的输出文件。 cat (“concatenate”的缩写)命令在其输入上接受一个或多个文件并将它们作为一个单独的文件打印到它的输出。例如, cat chapter01 chapter02 chapter03 > book 将三个 chapterXX 文件保存在一个单独的 book 文件中。

输入文件按照它们在 cat 命令后的排列顺序被打印,因此,要调换信息的顺序,就必须先调换输入文件的顺序。此外,当需要处理的文件数目对于您来说过大而无法手工输入这些文件的名称 时,您可以使用通配符,如在 cat chapter* > book 中使用的那样,记住,文件名将会按升序排列。当您突然发现 chapter13 被发送到输出中时会在 chapter2 之前,而会在 chapter02 之后时,这会引起很有意思的问题。

cat 的输出没有被重定向到一个文件或另一个命令的标准输出时, cat 表现出来的行为与多数命令行工具一样,即将其输出发送到控制台。 这意味着您可以使用 cat 来显示文件;例如,您可以使用 cat /etc/passwd 来显示系统密码文件的内容。为方便起见,您应该用 less 查看大文件,如在 less /etc/passwd 中那样(您可以通过输入 man less 学习更多关于 less 的知识)。

尽管 cat 主要用于合并文件,您还可以将它用于输入的简单自动处理。例如,您可以使用 一个单独的空白行来除去多行空白行(使用 -s 选项),这是一个在您将源代码公诸于世前进行清除工作的好办法。遗憾的是, cat 并没有用于一次清除所有空白行的选项。但这并不是什么大问题,因为您 可以使用方便的 sed 命令将这些空白行除去:

清单 1. 使用 sed 与 cat 除去空白行
$ cat -s /etc/X11/XF86Config | sed '/^[[:space:]]*$/d'
...
# Multiple FontPath entries are allowed (they are concatenated together)
# By default, Red Hat 6.0 and later now use a font server independent of
# the X server to render fonts.
    FontPath   "/usr/X11R6/lib/X11/fonts/TrueType"
    FontPath   "unix/:7100"
EndSection
...

对于读取配置文件和 HTML 页面的源文件,特别是那些由脚本生成的插入了不必要新行的源文件,以及那些包含大型条件结构(其各个项之间已经用空行分开)的源文件来说,空白行紧缩是一个方便的技巧。

cat 的另外一个重要的功能是它可以对行进行编号。这种功能对于程序文档的 编制以及法律和科学文档的编制很方便。打印在左边的行号使得参考文档的某一部分变得容易。这在编程、科学研究、业务报告或甚至是立法工作中都是非常重要的。 对行进行编号功能有两个选项: -b 选项(只能对非空白行进行编号)和 -n 选项(可以对所有行进行编号):

清单 2. 对行进行编号
$ cat -b /etc/X11/XF86Config
...
    14  # Multiple FontPath entries are allowed (they are concatenated together)
    15  # By default, Red Hat 6.0 and later now use a font server independent of
    16  # the X server to render fonts.
    17      FontPath   "/usr/X11R6/lib/X11/fonts/TrueType"
    18      FontPath   "unix/:7100"
    19  EndSection
...
$ cat -n /etc/X11/XF86Config
...
    20  # Multiple FontPath entries are allowed (they are concatenated together)
    21  # By default, Red Hat 6.0 and later now use a font server independent of
    22  # the X server to render fonts.
    23  
    24      FontPath   "/usr/X11R6/lib/X11/fonts/TrueType"
    25      FontPath   "unix/:7100"
    26  
    27  EndSection
...

cat 还可以在您查看包含如制表符这样的非打印字符的文件时起帮助作用。 您可以用以下选项来显示制表符:

  • -T 将制表符显示为 ^I
  • -v 显示非打印字符,除了换行符和制表符,它们使用各自效果相当的“控制序列”。 例如,当您处理一个在 Windows 系统中生成的文件时,这个文件将使用 Control-M( ^M )来标记行的结束。对于代码大于 127 的字符,它们的前面将会被加上 M- (表示“meta”),这与其它系统中在字符前面加上 Alt- 相当。
  • -E 在每一行的结束处添加美元符( $ )。

清单 3. 显示非打印字符
$ cat -t /etc/X11/XF86Config
...
# Multiple FontPath entries are allowed (they are concatenated together)
# By default, Red Hat 6.0 and later now use a font server independent of
# the X server to render fonts.
^IFontPath^I"/usr/X11R6/lib/X11/fonts/TrueType"
^IFontPath^I"unix/:7100"
EndSection
...
$ cat -E /etc/X11/XF86Config
...
# Multiple FontPath entries are allowed (they are concatenated together)$
# By default, Red Hat 6.0 and later now use a font server independent of$
# the X server to render fonts.$
$
    FontPath   "/usr/X11R6/lib/X11/fonts/TrueType"$
    FontPath   "unix/:7100"$
$
EndSection$
...
$ cat -v /etc/X11/XF86Config
...
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@M-|M-8^X^@^@^@
P^@^O"M-X^O M-@^M^@^@^@M-^@^O"M-@M-k^@M-8*^@
@M-^H$M-@M-9|A(M-@)M-yM-|M-sM-*M-hW^A^@^@j^@
M-|M-sM-%1M-@M-9^@^B^@^@M-sM-+fM-^A= ^@ ^@
F^@^@   ^@M-9^@^H^@^@M-sM-$M-G^E(l!M-@M-^?
^IM-A5^@^@^D^@PM-^]M-^\X1M-H%^@^@^D^@tyM-G
...

下回我们将看一下 headtail 。到时候见!同时,如果您有什么问题或评论,我会乐于收到您的来信 — 您可以发电子邮件至 jacek@artymiak.com



参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文.

  • 本系列中对文本实用程序的介绍对手册页和信息页中的信息是一个补充。要学习更多关于这方面的知识,请打开一个新的终端窗口并输入 man catinfo cat — 或者您可以打开一个新的浏览器窗口并 查看 gnu.org 上的 cat 手册页



  • 您还可以参阅 cat 行话文件入门。了解为什么 cat 被认为既是优秀的用户界面设计的示例,又是拙劣的用户界面设计的典型示例。



  • 您可以在 GNU text utilities 手册(位于 MIT 的 同一目录的展开视图,在 MIT,您还可以找到 众多更加有用的 GNU 工具的列表)找到关于我们了解并喜欢的这些工具(它们都是文本实用程序)的更多信息。



  • Windows 用户可以在 Cygwin软件包中找到这些工具。



  • Mac OS X 用户可能想尝试 Fink,它在 Mac OS X 下安装丰富的 UNIX 环境。



  • 您碰到了一些问题?请查阅 GNU 文本实用程序常见问题解答



  • 在钻研我们这里讲述的工具之前还需要更多介绍性的信息?您可以尝试从 UNIXhelp for users起步。



  • 或者尝试本系列的介绍性文章“ 技巧:了解 textutils”( developerWorks,2002 年 10 月)。



  • 这一领域的经典著作是 UNIX Power Tools,Jerry Peek、Tim O'Reilly 和 Mike Loukides 著(O'Reilly and Associates,1997);ISBN 1-56592-260-3。



  • developerWorksLinux 专区 查找您正在寻找的 Linux 参考资料。


关于作者

Jacek Artymiak 是一位自由顾问、开发人员和作家。自从 1991 年他就一直为许多商业性和免费的 UNIX 和 BSD 操作系统的变体(AIX、HP-UX、IRIX、Solaris、Linux、FreeBSD、NetBSD、OpenBSD 和其它操作系统)和 MS-DOS、Microsoft Windows、Mac OS 与 Mac OS X 等开发软件。Jacek 擅长商业和金融应用程序开发、Web 设计、网络安全、计算机图形、动画和多媒体。在技术主题方面,他是一位多产的作家,并与他人一同合著了“Install, Configure, and Customize Slackware Linux”(Prima Tech,2000)和“StarOffice for Linux Bible”(IDG Books,2000)。在 SourceForge 上可以找到许多 Jacek 的软件项目。可以从他的 个人网站更多地了解他,可以通过 jacek@artymiak.com与他联系。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款