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

文件操作和过滤

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

 

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 命令,它会输出排序列表的最后一行。

特别说明:尊重作者的劳动成果,转载请注明出处哦~~~http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt103

时间: 2024-11-05 19:43:19

cat、tail、head、tee、grep、wc、sort文件操作和过滤的相关文章

转摘--如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等

http://www.vaikan.com/use-multiple-cpu-cores-with-your-linux-commands/ 你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作--一些无法并行的操作.数据专家们,我是在对你们说.你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, bzip2, wc, awk, sed等等,都是单线程的,只能使用一个CPU内核. 借用卡通人物Cartman的话,"如何我能使用这些内核"? 要

如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等

你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作--一些无法并行的操作.数据专家们,我是在对你们说.你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, bzip2, wc, awk, sed等等,都是单线程的,只能使用一个CPU内核. 借用卡通人物Cartman的话,"如何我能使用这些内核"? 要想让Linux命令使用所有的CPU内核,我们需要用到GNU Parallel命令,它让我们所有的CPU内核在单机内做神奇的map-reduce

如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等(转)

你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作--一些无法并行的操作.数据专家们,我是在对你们说.你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, bzip2, wc, awk, sed等等,都是单线程的,只能使用一个CPU内核. 借用卡通人物Cartman的话,"如何我能使用这些内核"? 要想让Linux命令使用所有的CPU内核,我们需要用到GNU Parallel命令,它让我们所有的CPU内核在单机内做神奇的map-reduce

Linux文件操作常用命令整理

收集.整理日常系统管理或维护当中的,常用到的一些关于文件操作的命令或需求,后续会慢慢补充.完善!   查看.生成指定目录的目录树结构?   [root@DB-Server ~]#tree   #当前目录   [root@DB-Server ~]#tree  /home/oracle/kerry   查看当前目录或指定目录的大小? [root@DB-Server ~]#du -sh /u01 [root@DB-Server ~]#du -sh   查看各个文件或子文件夹大小 [root@DB-Se

Python基本语法_文件操作_读写函数详解

目录 目录 软件环境 file文件对象 open文件操作 读文件 read读取所有文件内容 readline获取一行内容 readlines读取所有文件内容 readreadlinereadlines的区别 写文件 write writelines写入多行内容 write和writelines的区别 将标准输出重定向写入到指定文件 文件指针 tell获取当前文件指针位置 truncate截断文件 seek转移文件指针 最后 软件环境 系统 UbuntuKylin 14.01 软件 Python

第十二章 Python文件操作

12.1 open() open()函数作用是打开文件,返回一个文件对象. 用法格式:open(name[, mode[, buffering[,encoding]]]) -> file object name 文件名 mode 模式,比如以只读方式打开 buffering 缓冲区 encoding 返回数据采用的什么编码,一般utf8或gbk Mode Description r 只读,默认 w 只写,打开前清空文件内容 a 追加 a+ 读写,写到文件末尾 w+ 可读写,清空文件内容 r+ 可

基于php常用函数总结(数组,字符串,时间,文件操作)

数组:[重点1]implode(分隔,arr) 把数组值数据按指定字符连接起来 例如: $arr=array('1','2','3','4'); $str=implode('-',$arr); explode([分隔],arr)按指定规则对一个字符串进行分割,返回值为数组 别名join array_merge()合并一个或多个数组 array_combine(array keys, array values) 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值 例如: $a = ar

文件类型,c语言文件读写,文件缓冲,文件打开方式,文件操作函数

文件类型分为:流文件和设备文件,设备文件比如:VGA接口,串口,usb口,网口,串口,这些接口都被操作系统抽象成为了文件. 当我们写程序的时候默认已经帮我们打开了三个文件 分别是: stdin:标准输入,stdout:标准输出,stderr:标准出错,scanf实际上接收的是标准输入的数据,这时候的标准输入就是我们的键盘.              有四种方式清空缓冲区:      A.加'\n';            B.程序正常退出;      C.通过fflush(stdout)也可以清

急求,linux文件操作问题

问题描述 急求,linux文件操作问题 我想实现的效果:有一个文件,将该文件的最后一行追加到每一行的末尾,awk或者sed都可以,求大神实现,急求 解决方案 #用Python实现的代码 #coding=utf-8 from sys import argv import sys def main(argv): file = open("D:data.txt",'r') lines = file.readlines() file.close() file = open("D:da