`

cat、tail、head、tee、grep、wc、sort文件操作和过滤

阅读更多

详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt103

文件操作和过滤

绝大多数命令行工作是针对文件的。我们会在本节中讨论如何观察及过滤文件内容,使用一条命令从文件中提取所需信息,以及对文件的内容进行排序。

 

cat、tail、head、tee:文件打印命令
这些命令的语法基本上相同的:命令名 [选项] [文件],而且您可以在管道中使用这些命令。这些命令的功能都是根据特定的条件选择文件内容进行打印。

cat 工具会将文件的全部内容打印到标准输出。

这是最常用的命令之一。例如,您可以使用:

# cat /var/log/mail/info

将邮件程序守护程序日志的内容打印到标准输出[14]。

cat 命令有一个非常有用的选项(-n),该选项将允许您打印行号。

某些文件,如守护程序日志文件(如果相应的守护程序运行了的话)可能非常大[15],在屏幕上打印全部内容可能没什么必要。

您经常只是需要看看一个文件的某几行。

您可以使用 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 postfix' >./patterns.txt

然后,我们将会用 patterns.txt 文件中的模式列表作为参数调用 fgrep 工具,而不是“两次调用”grep:
# fgrep -f ./patterns.txt /var/log/mail/info

文件 ./patterns.txt 可以包含您喜欢的任意多个模式。每个模式都必须独占一行。

例如,要选择已经成功发送给 的邮件的有关信息,只需将此电子邮件地址添加到 ./patterns.txt 文件,试试这条命令:
# echo 'peter@mandrakesoft.com' >>./patterns.txt

显然,您可以将 grep 与 tail 或者 head 组合起来使用。如果我们想要查找上上次发送给 的邮件,只需输入:
# fgrep -f ./patterns.txt /var/log/mail/info | tail -n2 | head -n1

在这里,我们应用了上面讲述的过滤器,并将其放入 tail 和 head 命令的管道。这将会从数据中取出倒数第二行。

 

wc:统计文件中的元素
wc 命令(Word Count)用于统计文件中的字符串的数量。它还可用于统计字节数、字符数以及最长行的长度。其语法为:
wc [选项] [文件]

下面的选项比较有用:

-l:打印换行符数;

-w:打印单词数;

-m:打印总计字符数;

-c:打印字节数;

-L:打印所获取文本中最长行的长度。

wc 命令默认情况下会打印换行符数、单词数和字符数。下面是一些例子:

如果我们想要查找系统中的用户数,我们就可以输入:
$wc -l /etc/passwd

如果我们想要知道系统中的 CPU 数,我们可以输入:
$grep "model name" /proc/cpuinfo |wc -l

在上一节中,我们通过 ./patterns.txt 文件获取了成功发送到指定电子邮件地址的邮件列表。如果我们想要知道一共有多少封邮件,那么可以将过滤结果重定向到 wc 命令的管道:
# fgrep -f ./patterns.txt /var/log/mail/info | wc -l
 

sort:排序文件内容
下面列出了这一强大工具的语法[16]:
sort [选项] [文件]

现在我们来考虑一下对 /etc/passwd 文件进行排序。正如您看到的,这个文件并未经过排序:
$ cat /etc/passwd

如果我们想要按照 login 域进行排序,则应输入:
$ sort /etc/passwd

默认情况下,sort 命令会按照第一个域(本例中就是 login)对数据进行升序排序。如果我们想要以降序方式排序,可以使用选项 -r:
$ sort -r /etc/passwd

每个用户在 /etc/passwd 文件中都有他自己的 UID。现在我们来试试按照 UID 域进行升序排序:
$ sort /etc/passwd -t":" -k3 -n

我们在这里用到了下列 sort 选项:

-t":":通知 sort 域之间通过 ":" 符号分隔;

-k3:意味着要根据第三列进行排序;

-n:表明排序是按照数字顺序,而非字母顺序。

如果要想按照降序排序,就是:
$ sort /etc/passwd -t":" -k3 -n -r

请注意,sort 还有两个比较重要的选项:

-u:执行严格定序:重复的排序关键字将被丢弃;

-f:忽略大小写。

最后,如果我们想要找到 UID 最高的用户,可以使用这条命令:
$ sort /etc/passwd -t":" -k3 -n |tail -n1

我们先是对 /etc/passwd 文件按 UID 进行了升序排序,然后将结果通过管道传送给 tail 命令,它会输出排序列表的最后一行。

分享到:
评论

相关推荐

    Linux课堂笔记.pdf

    一、操作系统概述 1、 操作系统 2、 不同应用利于的主流操作系统二、系统安装 1、安装VM虚拟机 1.1 简要介绍 1.2 配置网卡 2、 配置网卡信息 3、 Linux目录详解 三、 命令概述 1、 常用快捷键 2、 Linux 终端命令...

    linux学习笔记,最经常用的命令

    在Linux操作系统中,掌握一些基础的命令是至关重要的,这能够帮助你更高效地管理和操作文件系统。以下是关于标题"Linux学习笔记,最经常用的命令"和描述"学习LINUX最先接触的一些命令,比较实用"中涉及的几个关键...

    Linux实验报告_第二章.doc

    3. 文件操作:包括使用`cp`复制文件,`cat`显示文件内容,`grep`查找特定内容,`sort`排序,`diff`比较文件,`rm`删除文件。 4. 目录管理:`mkdir`创建目录,`rmdir`删除目录,`cd`切换目录,`ls`列出目录内容,`...

    LinuxShell编程基础教程.pdf

    * wc:计算文件行数、单词数和字符数 * cp:文件拷贝 * mv:重命名文件或移动文件 * rm:删除文件 * grep:在文件内搜索字符串 * cut:指定欲显示的文件内容范围,并将它们输出到标准输出设备 * cat:输出文件内容到...

    Linux-shell脚本全面学习.pdf

    + `wc`:计算文件行数、单词数和字符数 + `cp`:文件拷贝 + `mv`:重命名文件或移动文件 + `rm`:删除文件 + `grep`:在文件搜索字符串 + `cut`:指定欲显示的文件容围 + `cat`:输出文件容到标准输出设备 +...

    Unix命令大全手册借鉴.pdf

    6. **文件编辑相关命令**:`cat`合并并显示文件内容,`tee`同时输出到屏幕和文件,`more`和`less`分页浏览文件,`head`和`tail`分别显示文件开头和结尾,`fold`折叠长行,`sort`排序文件内容,`cmp`比较文件差异,`...

    运维常用Linux命令、Shell技巧范例

    - **查看文件开头和结尾**:`head` 和 `tail -f` 分别用于查看文件开头和末尾的内容,其中 `-f` 选项用于持续监控文件变化。 - **检查文件类型**:`file` 命令可以用来确定文件的类型。 - **重命名文件**:`rename...

    Linux 脚本编写

    - `head`和`tail`分别显示文件的开头和结尾部分。 - `sed`进行文本替换,支持正则表达式。 - `awk`用于处理文本文件中的字段,可以自定义分隔符。 此外,还有流程控制结构,如条件语句(`if`、`else`、`elif`)、...

    Linux必学60个命令文件

    12. **head** 和 **tail**:查看文件开头或结尾的几行。 13. **echo**:将文本或变量内容输出到屏幕。 14. **grep**:搜索文件中的特定字符串或模式。 15. **find**:根据各种条件查找文件,如名字、大小、时间等。 ...

    Linux Shell脚本编程基础

    - `head`和`tail`显示文件的开头或结尾部分。 - `sed`用于文本流编辑,支持正则表达式替换。 - `awk`用于处理文本文件中的字段,可以自定义分隔符。 此外,Shell脚本还支持条件语句(`if-then-else`)、循环(`for`...

    Linux脚本编程基础.pdf

    文件操作命令是脚本中经常使用的,如`cat`、`head`、`tail`等,分别用于显示文件内容、查看文件头部或尾部的内容。 `cut`命令可以用来截取文件中的列,`sort`可以对数据进行排序,`uniq`命令可以过滤掉重复的行。`...

    Linux环境下shell编程

    Shell提供了丰富的命令来帮助用户管理和操作文件系统,下面列举了一些常用的Shell命令及其用法: 1. **echo**: 用于打印文本到标准输出(屏幕)。例如:`echo "Hello World"`。 2. **ls**: 显示当前目录下的文件...

    shell程序设计

    shell脚本可以使用Linux系统的各种命令,如`echo`, `ls`, `wc`, `cp`, `mv`, `rm`, `grep`, `cut`, `cat`, `file`, `read`, `sort`, `uniq`, `expr`, `find`, `tee`, `basename`, `dirname`, `head`, `tail`, `sed`...

    UNIX操作系统培训教材

    - **head/tail**: 查看文件开头/结尾的部分内容。 - **more/less**: 分页显示文件内容。 - **cp/mv**: 复制/移动文件或目录。 - **rm**: 删除文件或目录。 - **chmod/chown/chgrp**: 修改文件权限、所有权和所属组。...

    Linux命令.pdf

    ### Linux命令知识点详解 #### 一、文件管理 在Linux环境下,文件管理是...这些命令涵盖了Linux系统中文件管理、文档编辑、文件传输以及磁盘管理方面的基础操作,熟练掌握它们对于有效管理和操作Linux系统至关重要。

    LinuxShell编程学习

    - **`tee`**:读取标准输入并写入标准输出和文件。 - **`basename`**:移除路径中的目录名。 - **`dirname`**:提取路径中的目录名。 - **`head`**:显示文件的头部。 - **`tail`**:显示文件的尾部。 - **`...

Global site tag (gtag.js) - Google Analytics