首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

linux 查看资料和管道命令

2012-07-04 
linux查看文件和管道命令??? cat、tail、head、tee。这些命令的语法基本上相同的:命令名 [选项] [文件],而且您

linux 查看文件和管道命令

??? 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
??? 怎样才能在输出卷过屏幕之前仔细查看它们呢?
??? 把输出用管道导入到一个叫做 less 的程序工具。 less 是一个分页显示文件的工具工具,它允许你一页一页(或一个屏幕一个屏幕)地查看信息。使用竖线( | )来把输出用管道导入到命令中。
??? ls -al /var/html/? | less
??? 现在,你就可以一个屏幕一个屏幕地查看 /etc 目录的内容了。要向前移动一个屏幕,按 [Space] 键;要向后移动一个屏幕,按 键;要退出,按 [q] 键。使用 less 命令时,你还可以使用箭头键来前后移动。要使用 less 来搜索文本文件的输出,按 [/] ,然后键入你想在文件内搜索的内容。
? 譬如:/grep
??? 管道还可以用来只打印一个文件中的某些行。
??? 键入:grep php test.php | lpr
??? 这将会打印 test.php 文件中提到“php”这个词的每一行.
??? 不仅要查看/lib目录下面有哪些文件,还希望用一个文件来纪录刚才ls的命令显示的所有结果,用两个管道符号:“>” 和“>>”,也就是大于符号啦。
  ls /var/html/ >list.txt
  还有一个管道符号是由两个大于号组成的“>>”,它和刚才“>”的区别在于一个大于符号的管道是用来创建一个新的文件 list.txt,如果已经有了同名的文件就复盖掉以前的内容;而两个大于符号的管道是用来在已经存在的文件后面追加新的内容,如果没有这个文件就创建它。
  现在我们vi list.txt看看一共有多少行,是不是1000多行啊?我们运行
  ls /var/html/? >> list.txt
  其实这两个管道符号很容易记忆,向左边的箭头意思就是把前面命令的内容输入到后面的文件中去,刚才那个“|”管道符号是用来把前面命令的输出结果当作后面一个命令的输入数据。下面我们看一个和刚才“>>”刚刚相反的管道符号“<<”:
  cat >> test.php << "EOF"
  > a
  > b
  > c
  > EOF
  运行第一行以后,意思就是把我们接下来的输入内容保存到test.php文件里面,当我们输入“EOF”的时候结束。“<<”的意思就是向前面的命令传送一个数据。中间我象征性的输入了a b c三行,每一行前面的“>”是系统自动产生的提示符号。第四行输入“EOF”系统就保存刚才输入的a b c三行到一个叫做test.php的文件里面去。现在我们cat test.php 已经有输入的内容。

?

热点排行