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

developerWorks 中国  >  Linux  >

技巧: 使用 head 和 tail 以块方式读取文本流

认识您的文本实用程序

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

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

2002 年 10 月 09 日

Jacek 在本技巧文章中介绍了 head 和 tail 命令,它们对于以块方式处理静态和动态文件中的数据非常有用。

假定您想只处理文件的一部分,譬如头几行或后几行,那您该怎么做呢?请使用 head (它将头 10 行发送至标准输出)或 tail (它将后 10 行发送至标准输出)。

您可以通过使用 -n 选项改变这些命令发送至其标准输出的行数(当然,输出结果将随 XF86Config 文件的内容而不同):

清单 1. 将 XF86Config 中选定行数的内容发送至标准输出
$ head -n 4 /etc/X11/XF86Config
# File generated by anaconda.
# **********************************************************************
# Refer to the XF86Config(4/5) man page for details about the format of
# this file.
$ tail -n 4 /etc/X11/XF86Config
Modes       "1600x1200"
ViewPort    0 0
EndSubsection
EndSection

如果您想让 headtail 以字节而不是以行为单位,那该怎么办呢?您可以用 -c 选项代替 -n 选项。因此,要显示前 200 个字符,请使用 head -c 200 file ,或者使用 tail -c 200 file 来显示后 200 个字符。如果数字后面跟有 b (表示块(block)),那么这个数字将被乘以 512。类似地,跟有 k (表示千字节(kilobyte))表示用 1024 去乘给定的数字,而跟有 m (表示兆字节(megabyte))表示用 1048576 字节去乘给定的数字。

请记住, head file1 file2 file3cat file1 file2 file3 | head 之间有重大差别。前者将打印每个文件指定行数的内容,不同文件的内容之间用头信息隔开,头信息以 ==> 后跟文件名开头。后者将打印由 cat 命令后所列文件组成的输入流中指定行数的内容,但将把输入流作为单个文件对待。可以使用 -q (表示静默(quiet))选项关闭文件名头信息。与 -q 相反的是 -v (表示详列(verbose))。

假如您要处理的文件在处理期间一直在发生变化(比如,当您让 headtail 读取来自正在被另一个命令写入的文件的数据时,就是这种情况),请使用 -f 选项让 tail 持续读取来自指定文件的数据并将这些数据发送至 tail 自己的标准输出中。通过管道发送数据时该选项会被忽略。因此, cat file | tail -f 将不会得到所期望的结果,但 tail -f file 则可以。

(如果 tail 正在读取的文件不止一个,那么各行内容之间将用标准头信息隔开,以指明它们来自哪个文件,标准头信息以 ==> 开头。)

这个选项用于监视系统日志再合适不过,譬如,在单独的终端窗口(或单独的控制台)中执行的 tail -f /var/log/access.log 将持续打印每次点击后新添加的 Apache 访问日志条目,一直到您用 Ctrl-C 停止它为止。

通过组合使用 headtail ,可以从文件的中间部分读取给定长度的一块数据!下面说明如何做到:假定您想从文件开头算起第 1000 字节处开始读取一块 789 字节的数据。可以使用 cat file | head -c 1788 | tail -c 789 来解决这一问题。

tac 命令逆序排序文件

如果您想对文件中的各行进行逆序排序,该怎么做呢?这就要用到 tac 命令。(请注意, taccat 逆序拼写而成。)该命令对所列出的文件中的各行或各段进行逆序排序。

该命令不能逆序排序各文件的顺序 — 这个任务您得自己做,以逆向顺序在 tac 命令后列出各文件即可。作为说明 tac 的工作原理的示例,请在您的主目录中对一些文件使用 ls -l | taills -l | tail | tac ,比较其结果。

您有问题或意见吗?我愿洗耳恭听 — 请将邮件发送至 jacek@artymiak.com

下回我们将看看 sorttsort 命令。到时候见!



参考资料



关于作者

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 使用条款