技巧:用 cat 合并文件

技巧:用 cat 合并文件

http://www-900.ibm.com/developer ... tiptex2/index.shtml
  
技巧:用 cat 合并文件
认识您的文本实用程序
Jacek Artymiak(jacek@artymiak.com)
自由作家和顾问
2002 年 10 月
  
    在我们有关 GNU 文本实用程序的连续系列中,Jacek Artymiak 对 cat 做了一下研
究 ― cat 这个命令是 UNIX 爱好者所热爱的,也是厌恶 UNIX 的人所憎恶的。
  
您常常需要将几个文件处理成一个文件并将这种处理的结果保存到一个单独的输出文件
。cat(“concatenate”的缩写)命令在其输入上接受一个或多个文件并将它们作为一
个单独的文件打印到它的输出。例如,cat chapter01 chapter02 chapter03 > book 将
三个 chapterXX 文件保存在一个单独的 book 文件中。
  
输入文件按照它们在 cat 命令后的排列顺序被打印,因此,要调换信息的顺序,就必须
先调换输入文件的顺序。此外,当需要处理的文件数目对于您来说过大而无法手工输入
这些文件的名称时,您可以使用通配符,如在 cat chapter* > book 中使用的那样,记
住,文件名将会按升序排列。当您突然发现 chapter13 被发送到输出中时会在 chapte
r2 之前,而会在 chapter02 之后时,这会引起很有意思的问题。
  
当 cat 的输出没有被重定向到一个文件或另一个命令的标准输出时,cat 表现出来的行
为与多数命令行工具一样,即将其输出发送到控制台。这意味着您可以使用 cat 来显示
文件;例如,您可以使用 cat /etc/passwd 来显示系统密码文件的内容。为方便起见,
您应该用 less 查看大文件,如在 less /etc/passwd 中那样(您可以通过输入 man l
ess 学习更多关于 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 toget
    15  # By default, Red Hat 6.0 and later now use a font server independen
    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 toget
    21  # By default, Red Hat 6.0 and later now use a font server independen
    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
...
  
下回我们将看一下 head 和 tail。到时候见!同时,如果您有什么问题或评论,我会
乐于收到您的来信 ― 您可以发电子邮件至 jacek@artymiak.com
  
参考资料
  
    * 本系列中对文本实用程序的介绍对手册页和信息页中的信息是一个补充。要学习
更多关于这方面的知识,请打开一个新的终端窗口并输入 man cat 或 info cat ― 或
者您可以打开一个新的浏览器窗口并查看 gnu.org 上的 cat 手册页。
  
    * 您还可以参阅 cat 行话文件入门。了解为什么 cat 被认为既是优秀的用户界面
设计的示例,又是拙劣的用户界面设计的典型示例。
  
    * 您可以在 GNU text utilities 手册(位于 MIT 的同一目录的展开视图,在 MI
T,您还可以找到众多更加有用的 GNU 工具的列表)找到关于我们了解并喜欢的这些工
具(它们都是文本实用程序)的更多信息。
  
    * Windows 用户可以在 Cygwin 软件包中找到这些工具。
  
    * Mac OS X 用户可能想尝试 Fink,它在 Mac OS X 下安装丰富的 UNIX 环境。
  
    * 您碰到了一些问题?请查阅 GNU 文本实用程序常见问题解答。
  
    * 在钻研我们这里讲述的工具之前还需要更多介绍性的信息?您可以尝试从 UNIXh
elp for users 起步。
  
    * 或者尝试本系列的介绍性文章“技巧:了解 textutils”(developerWorks,20

02 年 10 月)。
  
    * 这一领域的经典著作是 UNIX Power Tools,Jerry Peek、Tim O'Reilly 和 Mik
e Loukides 著(O'Reilly and Associates,1997);ISBN 1-56592-260-3。
  
    * 在 developerWorks Linux 专区查找您正在寻找的 Linux 参考资料。
  
关于作者
  
Jacek Artymiak 以 自由顾问、开发人员和作家为业。自 1991 年来,他一直在为 UNI
X 和各种 BSD 操作系统的各种商业及免费版本(AIX、HP-UX、IRIX、Solaris、Linux、
FreeBSD、NetBSD、OpenBSD 和其他)以及 MS-DOS、Microsoft Windows、Mac OS 和 M
ac OS X 开发软件。Jacek 专攻业务及金融应用程序开发、Web 设计、网络安全性、计
算机图形、动画和多媒体。他是撰写技术主题著作的多产作家,还与别人合著了“Inst
all, Configure, and Customize Slackware Linux”(Prima Tech,2000)和“StarO
ffice for Linux Bible”(IDG Books,2000)。Jacek 的许多软件项目都可以在 Sou
rceForge 中找到。您可以在他的个人 Web 站点了解关于他的更多信息,并通过 jacek
@artymiak.com 与他联系。      
Good!      
呵呵,我最喜欢这一段,现在可以很方便很清楚的贴源代码给人家看了:
$ cat -n /etc/X11/XF86Config
...
20 # Multiple FontPath entries are allowed (they are concatenated toget
21 # By default, Red Hat 6.0 and later now use a font server independen
22 # the X server to render fonts.
23
24 FontPath "/usr/X11R6/lib/X11/fonts/TrueType"
25 FontPath "unix/:7100"
26
27 EndSection