Shell 使用head与tail打印文件的前10行和后10行,cat
命令并不适合查看上千行的大文件,因为它会把整个文件内容全部给打印出来。相反,我们只想查看文件的一小部分内容(例如文件的前10行或后10行)。有时候可能是文件的前n行或后n行,也可能是除了前n行或后n行之外所有的行,亦或是第m行至第n行。
head
和tail
命令可以帮助我们实现这些需求。
实战演练
head
命令总是读取输入文件的起始部分。
(1) 打印前10行:
(2) 从stdin
读取数据:
(3) 指定打印前几行:
该命令会打印出文件的前4行。
(4) 打印除了最后M行之外所有的行:
注意,这里的
-M
表示的是负数,并非选项。
例如,用下面的命令可以打印出除最后5行之外的所有行:
而下面的命令会打印出文件的第1行至第5行:
(5) 打印除最后几行之外的其他行是head
的一种常见用法。在检查日志文件时,我们通常要查看最近(也就是最后)的若干行。
(6) 打印文件的最后10行:
(7) 从stdin
中读取输入:
(8) 打印最后5行:
(9) 打印除了前M行之外所有的行:
例如,打印除前5行之外的所有行,M+1=6
,因此使用下列命令:
这条命令将打印出第6行至第100行。
tail
命令的一个常见用法是监视一个内容不断增加的文件(例如系统日志文件)中出现的新行。因为新增加的行都是出现在文件的尾部,可以在其被写入的时候,使用tail
将这些行显示出来。为了能够监视文件的增长,tail
有一个特殊的选项-f
或--follow
,允许tail
关注文件内容的更新并将其显示出来:
你可能希望将该命令用于日志文件。监视文件内容增加的命令如下:
或者
dmesg
可以查看内核的环形缓冲区消息。我们通常使用该命令调试USB设备、检查磁盘操作或是监视网络连接性。-f
还可以加入一个睡眠间隔-s
,这样我们就可以设置监视文件更新的时间间隔了。
可以设置tail
在指定进程结束后随之结束运行,假设进程Foo
在向一个我们正在监视的文件中追加数据,那么tail -f
应该一直执行到进程Foo
结束。
当进程Foo
结束之后,tail
也会跟着结束。
让我们实际演练一下。
(1) 创建一个新文件file.txt,使用你惯用的文本编辑器打开这个文件。
(2) 现在运行下列命令:
(3) 向文件添加新行并不断地保存文件。
当你更新文件时,新添加的内容都会被tail
命令写入终端。关闭文本编辑器后,tail
命令也会随之结束。