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