我们可以将输出的数据作一个最简单的撷取,那就是取出文件前面几行 (head) 或取出后面几行 (tail) 文字的功能。 不过,要注意的是, head 与 tail 都是以“行”为单位来进行数据撷取的。
head (取出前面几行)
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(取出后面几行)
有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。