我们可以将输出的数据作一个最简单的撷取,那就是取出文件前面几行 (head) 或取出后面几行 (tail) 文字的功能。 不过,要注意的是, head 与 tail 都是以“行”为单位来进行数据撷取的喔!
- head (取出前面几行)
[root@study ~]# head [-n number] 文件
选项与参数:
-n :后面接数字,代表显示几行的意思
[root@study ~]# head /etc/man_db.conf
# 默认的情况中,显示前面十行!若要显示前 20 行,就得要这样:
[root@study ~]# head -n 20 /etc/man_db.conf
范例:如果后面100行的数据都不打印,只打印/etc/man_db.conf的前面几行,该如何是好?
[root@study ~]# head -n -100 /etc/man_db.conf
head 的英文意思就是“头”啦,那么这个东西的用法自然就是显示出一个文件的前几行啰! 没错!就是这样!若没有加上 -n 这个选项时,默认只显示十行,若只要一行呢?那就加入“ head -n 1 filename ”即可!
另外那个 -n 选项后面的参数较有趣,如果接的是负数,例如上面范例的-n -100时,代表列前的所有行数, 但不包括后面100行。举例来说 CentOS 7.1 的 /etc/mandb.conf 共有131行,则上述的指令“head -n -100 /etc/man_db.conf” 就会列出前面31行,后面100行不会打印出来了。这样说,比较容易懂了吧? ^^
- tail (取出后面几行)
[root@study ~]# tail [-n number] 文件
选项与参数:
-n :后面接数字,代表显示几行的意思
-f :表示持续侦测后面所接的文件名,要等到按下[ctrl]-c才会结束tail的侦测
[root@study ~]# tail /etc/man_db.conf
# 默认的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样:
[root@study ~]# tail -n 20 /etc/man_db.conf
范例一:如果不知道/etc/man_db.conf有几行,却只想列出100行以后的数据时?
[root@study ~]# tail -n +100 /etc/man_db.conf
范例二:持续侦测/var/log/messages的内容
[root@study ~]# tail -f /var/log/messages
&
lt;==要等到输入[crtl]-c之后才会离开tail这个指令的侦测!
有 head 自然就有 tail ( 尾巴 ) 啰!没错!这个 tail 的用法跟 head 的用法差不多类似,只是显示的是后面几行就是了!默认也是显示十行,若要显示非十行,就加 -n number 的选项即可。
范例一的内容就有趣啦!其实与head -n -xx有异曲同工之妙。当下达“tail -n +100 /etc/man_db.conf” 代表该文件从100行以后都会被列出来,同样的,在man_db.conf共有131行,因此第100~131行就会被列出来啦! 前面的99行都不会被显示出来喔!
至于范例二中,由于/var/log/messages随时会有数据写入,你想要让该文件有数据写入时就立刻显示到屏幕上, 就利用 -f 这个选项,他可以一直侦测/var/log/messages这个文件,新加入的数据都会被显示到屏幕上。 直到你按下[crtl]-c才会离开tail的侦测喔!由于 messages 必须要 root 权限才能看,所以该范例得要使用 root 来查询喔!
例题:假如我想要显示 /etc/man_db.conf 的第 11 到第 20 行呢?答:这个应该不算难,想一想,在第 11 到第 20 行,那么我取前 20 行,再取后十行,所以结果就是:“ head -n 20 /etc/man_db.conf | tail -n 10 ”,这样就可以得到第 11 到第 20 行之间的内容了!
这两个指令中间有个管线 (|) 的符号存在,这个管线的意思是:“前面的指令所输出的讯息,请通过管线交由后续的指令继续使用”的意思。 所以, head -n 20 /etc/man_db.conf 会将文件内的 20 行取出来,但不输出到屏幕上,而是转交给后续的 tail 指令继续处理。 因此 tail “不需要接文件名”,因为 tail 所需要的数据是来自于 head 处理后的结果!这样说,有没有理解?
更多的管线命令,我们会在第三篇继续解释的!
例题:承上一题,那如果我想要列出正确的行号呢?就是屏幕上仅列出 /etc/man_db.conf 的第 11 到第 20 行,且有行号存在?答:我们可以通过 cat -n 来带出行号,然后再通过 head/tail 来撷取数据即可!所以就变成如下的模样了: cat -n /etc/man_db.conf | head -n 20 | tail -n 10