日期:2014-05-16 浏览次数:21018 次
??? cat、tail、head、tee。这些命令的语法基本上相同的:命令名 [选项] [文件],而且您可以在管道中使用这些命令。这些命令的功能都是根据特定的条件选择文件内容进行打印。
??? cat 工具会将文件的全部内容打印到标准输出。这是最常用的命令之一。例如,您可以使用:
??? # cat /var/log/mail/info
??? 将邮件程序守护程序日志的内容打印到标准输出。cat 命令有一个非常有用的选项(-n),该选项将允许您打印行号。某些文件,如守护程序日志文件(如果相应的守护程序运行了的话)可能非常大,在屏幕上打印全部内容可能没什么必要。您经常只是需要看看一个文件的某几行。您可以使用 tail 命令完成这一功能。默认情况下,下面的命令将会打印 /var/log/mail/info 文件的最后十行:
??? # tail /var/log/mail/info
??? 您可以使用 -n 选项显示文件的最后 N 行。例如,要显示最后两行,您应该执行:
??? # tail -n2 /var/log/mail/info
??? 而 head 命令与 tail 十分相似,只是打印文件的头几行。默认情况下,下面的命令将会打印 /var/log/mail/info 文件的头十行:
??? # head /var/log/mail/info
??? 和 tail 一样,您也可以使用 -n 选项指定要打印的行数。例如,要打印前两行,您应该执行:
??? # head -n2 /var/log/mail/info
??? 您还可以组合使用这几条命令。例如,如果您想要只显示第九行和第十行,您可以先使用 head 命令选择文件的前十行,然后再将结果通过管道送到 tail 命令。
??? # head /var/log/mail/info | tail -n2
??? 竖线后面的部分将选择最后两行,然后将其打印到屏幕。同样地,您也可以选择只打印文件的倒数第 20 行:
??? # tail -n20 /var/log/mail/info |head -n1
??? 在本例中,我们让 tail 选择了文件的最后 20 行,然后将结果通过管道传送给 head。然后 head 命令将会从得到的数据中取出第一行打印到屏幕上。
??? 现在我们假定您想要将上例中的结果在屏幕上显示的同时还保存到文件 results.txt。tee 工具可以帮到我们。其语法是:
??? tee [选项] [文件]
??? 现在,我们可以将上一命令做如下更改:
?? # tail -n20 /var/log/mail/info |head -n1|tee results.txt
??? 再来举一个例子。我们想要选择最后 20 行,将其保存到 results.txt,但是只在屏幕上显示这 20 行中的第一行。那么,我们应该输入:
??? # tail -n20 /var/log/mail/info |tee results.txt |head -n1
??? tee 命令有一个非常有用的选项(-a),它允许您将数据追加到已有文件。
?? 让我们再回过头来看看 tail 命令。像日志这样的文件应该是在不断变化的,因为与其相关的守护程序每时每刻都在记录着它所执行的动作和发生的事件。所以,如果您想要交互地观看日志文件,您可以使用 -f 选项:
??? # tail -f /var/log/mail/info
??? 在本例中,/var/log/mail/info 文件的所有更改都会立即打印到屏幕上。当您想要知道您系统的工作原理时,使用带 -f 选项的 tail 命令将非常有用。例如,通过查看 /var/log/messages 日志文件,您可以时刻跟踪系统信息和各种守护程序。
??? 在下一节中,我们将会看到如何将 grep 用作过滤器,以便从来自其它服务的信息中拆出 Postfix 信息。
grep: 定位文件中的字符串
??? 不管是命令的名字还是缩写(“General Regular Expression Parser”)都显得非常古怪,但该命令的作用和用法却很简单:grep 将在一个或多个文件中查找给定的模式。其语法为:
??? grep [选项] <模式> [一个或多个文件]
??? 如果列出了多个文件,将会在每一行结果的开头附加相应的文件名。使用 -h 选项可以不显示这些文件名;使用 -l 选项可以只列出文件名。模式是一个正则表达式,尽管在大多数情况下只是一个简单的单词。下面列出了最常用的几个选项:
????? -i:进行不区分大小写的搜索;
????? -v:反转搜索。显示不与模式匹配的行;
????? -n:显示找到行的行号;
????? -w:让 grep 在进行模式匹配时匹配整个单词。
??? 让我们回到对邮件守护程序日志文件的分析中。我们想要在 /var/log/mail/info 中找到包含“postfix”模式的所有行。我们就需要输出这个命令:
??? # grep postfix /var/log/mail/info
??? grep 命令可用于管道。这样,下面的命令与上面的例子所得到的结果相同:
??? # cat /var/log/mail/info | grep postfix
??? 如果我们想要找到不与“postfix”模式匹配的所有行,我们就应该使用 -v 选项:
??? # grep -v postfix /var/log/mail/info
??? 现在,我们假定想要查找关于成功发出的邮件的全部信息。这样,我们需要找到邮件守护程序(包含“postfix”模式)在日志文件中添加的行,而且这些行还必须包含成功发送的信息(“status=sent”):
??? # grep postfix /var/log/mail/info |grep status=sent
??? 我们在本例中使用了两次 grep。这种方法虽然可以达到我们的目的,但显得有点麻烦。我们可以使用 fgrep 工具达到相同的效果。首先,我们需要创建一个包含需要匹配的模式的文件。这样的文件可以用这种方式来创建(我们使用 patterns.txt 来作为文件名):
??? # echo -e 'status=sent\npostfix' >./patterns.txt
??? 然后,我们将会用 patterns.txt 文件中的模式列表作为参数调用 fgrep 工具,而不是“两次调用”grep:
??? # fgrep -f ./patterns.txt /var/log/mail/info
??? 文件 ./patterns.txt 可以包含您喜欢的任意多个模式。每个模式都必须独占一行。例如,要选择已经成功发送给 peter@mandrakesoft.com 的邮件的有关信息,只需将此电子邮件地址添加到 ./patterns.txt 文件,试试这条命令:
??? # echo 'peter@mandrakesoft.com' >>./patterns.txt
??? 显然,您可以将 grep 与 tail 或者 head 组合起来使用。如果我们想要查找上上次发送给 peter@mandrakesoft.com 的邮件,只需输入:
??? # fgrep -f ./patterns.txt /var/log/mail/info | tail -n2 | head -n1
???
??? 在 Linux 中,管道连接着一个命令的标准输出和另一个命令的标准输入。我们应该知道我们有的时候会用到类似于“>”,“<”之类的重定位的SHELL语言完成特定的工作
而管道是进程中类似于重定位用法的一种进程之间的通信过程.让我们考虑一下非常常见的 ls 命令。 ls 有许多可用的选项,但是如果目录的内容卷动速度快得你无法查看时该怎么办呢? 比如/etc目录的文件就不是一屏可以显示完的
??? 当然ls可能有适当的参数来完成我们需要的功能-------分屏显示.但是,如果我们使用管道命令的话更方便也更直观。使用以下命令来查看 /etc 目录的内容:
??? ls -al /etc