功能:tail命令可以输出文件的尾部内容,默认情况下它显示文件的最后十行。
显示每个指定文件的最后10 行到标准输出。若指定了多于一个文件,程序会在每段输出的开始添加相应文件名作为头。如果不指定文件或文件为"-" ,则从标准输入读取数据。
它常用来动态监视文件的尾部内容的增长情况,比如用来监视日志文件的变化。

语法:tail   [选项]   [文件]
短选项 长选项 涵义
-c[+] K --bytes=[+] K 输出最后 K 字节;另外,使用-c +K 从每个文件的第 K 字节输出
-n[+] K --lines=[+] K 输出最后 K 行,代替最后10 行;使用-n +K 从每个文件的第 K 字节输出
-f --follow=descriptor
--follow=name
descriptor是 --follow 默认值,所以 -f 等价 --follow 等价--follow=descriptor
即时输出文件变化后追加的数据。
tail -f file 动态跟踪文件file的增长情况,tail会每隔一秒去检查一下文件是否增加新的内容。如果增加就追加在原来的输出后面显示。但这种情况,必须保证在执行tail命令时,文件已经存在。
如果想终止 tail -f 输出,按 Ctrl+C 中断tail程序。如果按Ctrl+C不能中断输出,那么可以在别的终端上执行 killall tail 强行终止。
  --pid=PID 同 -f 使用,当 PID 所对应的进程死去后,终止。
  ---retry 即使目标文件不可访问依然试图打开;在与参数-f 或 --follow=name 同时使用时常常有用。
-F --follow=name --retry 与 -f 相同,也是动态跟踪文件的变化,不同的是执行此命令时文件可以不存在。
  --max-unchanged-stats=N N 默认为5,使用--follow=name,重新打开一个在 N 次迭代后没有改变大小的文件来看它是否被解除连接或重命名(这是循环日志文件的通常情况)。
由于有inotify,这个选项很少使用。
-s S --sleep-interval=S 与 -f 合用,表示在每次反复的间隔休眠 S 秒
对于 --pid=PID ,每隔 S 秒检查进程。
-q --quiet 或 --silent 不输出文件名
-v --verbose 总是输出给出文件名的首部
  • K 后面可以跟乘号: 
    b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,GB 1000*1000*1000, G 1024*1024*1024, 对于T, P, E, Z, Y 同样适用。
  • 如果 + K (字节或者行数),那么从每个文件的开头算起的第 K 项开始显示。否则,显示该文件的最后 K 项。
  • 如果您希望即时追查一个文件的有效名称而非描述内容(例如循环日志),默认的程序动作(--follow=descriptor)并不如您所愿。在这种场合可以使用 --follow=name 选项,它会使tail定期追踪打开给定名称的文件,以确认它是否被删除或被其它某些程序重新创建过。
  • 同时按键盘上 Ctrl 键 和 C 键,退出显示。

tail 实例

测试的文件内容如下 
[quietheart@lv-k tail_test]$ cat tail_test 
1  04_libraryTest 
2  a.out 
3  a.out.symbol 
4  autotools 
5  core.31058 
6  cpp_test 
7  download_blog 
8  gpg_test 
9  hello-1.0.tar.gz 
10  hello-2.0 
11  hello-2.0.tgz 
12  main.cpp 
13  mysql20110512.sql 
14  rsynctest 
15  tail_ 
16  tail_test 
 
 
 
显示文件的最后10行 
[quietheart@lv-k tail_test]$ tail tail_test   显示文件tail_test的最后10行 
7  download_blog 
8  gpg_test 
9  hello-1.0.tar.gz 
10  hello-2.0 
11  hello-2.0.tgz 
12  main.cpp 
13  mysql20110512.sql 
14  rsynctest 
15  tail_ 
16  tail_test 
 
 
显示文件的最后N行 
[quietheart@lv-k tail_test]$ tail -n 5 tail_test   显示文件tail_test的最后5行 
12  main.cpp 
13  mysql20110512.sql 
14  rsynctest 
15  tail_ 
16  tail_test 
 
 
从第5行开始显示文件 
[quietheart@lv-k tail_test]$ tail -n +5 tail_test   注意指定的数字前面 + 代表从这个数字相应的位置开始,显示后面的内容 
5  core.31058 
6  cpp_test 
7  download_blog 
8  gpg_test 
9  hello-1.0.tar.gz 
10  hello-2.0 
11  hello-2.0.tgz 
12  main.cpp 
13  mysql20110512.sql 
14  rsynctest 
15  tail_ 
16  tail_test 
 
 
 
显示文件最后38个字节的内容 
[quietheart@lv-k tail_test]$ tail -c 38 tail_test 
ynctest 
15  tail_ 
16  tail_test 
  显示文件第38个字节开始之后的内容 
[quietheart@lv-k tail_test]$ tail -c +38 tail_test  
3  a.out.symbol 
4  autotools 
5  core.31058 
6  cpp_test 
7  download_blog 
8  gpg_test 
9  hello-1.0.tar.gz 
10  hello-2.0 
11  hello-2.0.tgz 
12  main.cpp 
13  mysql20110512.sql 
14  rsynctest 
15  tail_ 
16  tail_test 
注意指定的数字前面 + 代表从这个数字相应的位置开始,显示后面的内容。  

跟踪文件,tail -f 两种模式

默认是以文件描述符方式,跟踪文件的增长 
[quietheart@lv-k tail_test]$ tail -f tail_test   此时等价于命令 --follow=descriptor tail_test 
7  download_blog 
8  gpg_test 
9  hello-1.0.tar.gz 
10  hello-2.0 
11  hello-2.0.tgz 
12  main.cpp 
13  mysql20110512.sql 
14  rsynctest 
15  tail_ 
16  tail_test 
 
这里,输入之后,显示默认的文件的后10行,但是tail并没有因此而结束,而是一直在运行着,保持这那个文件对应的索引节点的打开状态。 接下来 
如果使用 echo new >>tail_test ,向文件追加新内容。那么会看到tail又继续将追加的内容打印出来。 
如果使用 echo new > tail_test ,清空原内容并重新写入新内容。那么tail会输出类似"tail: tail_test: file truncated"的字样来告诉文件内容被truncated了。
 
 

这个命令用于:跟踪动态增长的文件。例如系统日志。在默认情况下,根据它自己的文件描述符号来跟踪文件。
但是,有的程序追加文件内容的时候会将文件删除然后新建立一个。例如有些日志程序会在一定的时候将追加的日志文件重命名,然后再建立一个之前同名的新日志文件追加新的内容,这样的话这个命令就不好用了。再例如有些编辑器例如vim进行修改文件的时候,无法跟踪其变化。通过"ls -il"对vim编辑之前的文件和之后的文件的inode号对比发现,两者不同,应当是编辑的时候先删除文件的索引节点再新建立一个,新建的节点内容才包含了最新的内容,而之前tail打开的那个索引节点已经被删除了,看不见了,所以当然不会发生变化。
如果想要确定那么就先用"ps -aux |grep tail"找到tail的进程号,进入/proc目录的tail进程号目录中,查看其fd文件中的某个描述符号,例如"cat 3"这样会发现原来的内容。

 
 
以文件名方式,跟踪文件增长 
[quietheart@lv-k tail_test]$ tail --follow=name tail_test 
7  download_blog 
8  gpg_test 
9  hello-1.0.tar.gz 
10  hello-2.0 
11  hello-2.0.tgz 
12  main.cpp 
13  mysql20110512.sql 
14  rsynctest 
15  tail_ 
16  tail_test 
 
这样,tail根据文件名称跟踪文件的变化,默认来说tail就根据它自己的文件描述符号来跟踪文件,就像前面所说的,有的程序追加文件内容的时候会将文件删除然后新建立一个,例如有些日志程序会在一定的时候将追加的日志文件重命名,然后再建立一个之前同名的新日志文件追加新的内容,那么默认的方式就无法跟踪到文件的变化了,因为文件描述符号是代表一个索引节点的,而新追加的内容可能追加到新的索引节点上面了,这个时候就使用这个 --follow=name 选项。这样,如果当文件新追加内容是追加到同一名称的不同索引节点的情况发生时,那么tail那里就会提示 "tail: “tail_test” has been replaced;  following end of new file"之后,再重新显示追加之后的新的最后10行。

tail -f 与 tail -F

tail -f 和tail -F 的区别
-f 参数,如果在追踪此文档时,此文档被删除、转移或者重建了, 那就停止不会再输出了。
-F 参数,如果在追踪此文档时,此文档被删除、转移或者重建了, 那会再重新try那個同名的那個文档, 如果重建了, 会继续追踪此文档。

tail -f 文件

-f 是--follow[=HOW]的缩写。"[=HOW]"有两个写法,一个"=descriptor",另一个是"=name"。[=HOW]省略时,默认使用的是"--follow=descriptor"。-f 等价 -follow 等价--follow=descriptor。 

第一个窗口 
[root@cftest2 ~]# tail -f messages.3 
helll test2 
 
第二个窗口 
[root@cftest2 ~]# rm messages.3 
rm: remove regular file `messages.3'? y
[root@cftest2 ~]# echo "helll test3">>messages.3 
但是第一个窗口的tail -f 命令不会出现 hello test3 
 

descriptor 虽然是默认的参数,但是不一定是最有用的。比如在tail 一个log文件的时候,这个文件很可能是按照日期或者大小滚动,文件滚动之后这个tail -f 命令,就失效了。
如果你跟踪的文件被被删除、转移或者重建, 你还想继续tail它, 你可以使用这个 tail --follow=name 或者 tail -F

 
 
 

tail -F 文件

-F 是 -follow=name --retry 的缩写。--follow=name 是按照文件名跟踪文件,可以定期去重新打开文件检查文件是否被其它程序删除并重新建立。 --retry 这个参数,保证文件重新建立后,可以继续被跟踪。
 
第一个窗口 
[root@cftest2 ~]# tail -F messages.3 
helll test1 
tail: `messages.3' has become inaccessible: No such file or directory 
tail: `messages.3' has appeared;  following end of new file 
helll test2 
 
第二个窗口 
[root@cftest2 ~]# rm messages.3 
rm: remove regular file `messages.3'? y
[root@cftest2 ~]# echo "helll test3">>messages.3  
 
第一个窗口可以看到,中间删除了messages.3,但重新创建后并输入helll test2,会继续显示出来。 

tail -F 更强大

tail -F功能的强大,它等同于--follow=name --retry。如果你跟踪的文件被移动或者改名后, 你还想继续tail它, 你可以使用这个选项。
tail手册页中关于--retry的说明:keep trying to open a file even if it is inaccessible when tail starts or  if  it  becomes  inaccessible later; useful when following by name, i.e., with --follow=name。 tail命令开始执行时文件不存在或者执行过程中文件不能访问,会不断重试。
关于--follow的说明:-f, --follow[={name|descriptor}] output appended data as the file grows; -f, --follow, and --follow=descriptor are equivalent 。--follow=descriptor表明跟踪的是文件描述符,--follow=name表明跟踪的是文件名称。
如果文件名称改掉之后,还想继续跟踪原文件名称对应的尾部内容,就得使用 -F 选项而不是 -f 选项了。

[root@web imx_server]# tail -F log/IMX.LOG 
14:13:28.892  INFO ImxConnection[6] imx.server.ImxConnection - RX IMX_ACTIVE_TEST{seq=3460,client_id=1291343201649042,presence_status=1(presence_status_online),} 
14:13:28.892 DEBUG ImxConnection[6] org.logicalcobwebs.proxool.ImxDB - 006417 (01/02/00) - Connection #9 served 
14:13:28.892  INFO ImxConnection[6] imx.dbo.ImxOnlineInfoRow - EXEC SQL UPDATE imx_online_info SET last_active_time = '2010-12-03 14:13:28.0' WHERE account = 'zhy' 
14:13:28.894 DEBUG ImxConnection[6] org.logicalcobwebs.proxool.ImxDB - UPDATE imx_online_info SET last_active_time = '2010-12-03 14:13:28.0' WHERE account = 'zhy';  (1 milliseconds) 
14:13:28.894 DEBUG ImxConnection[6] org.logicalcobwebs.proxool.ImxDB - 006417 (00/02/00) - Connection #9 returned (now AVAILABLE) 
14:13:29.625  INFO ImxConnection[6] imx.server.ImxConnection - RX IMX_ACTIVE_TEST{seq=3461,client_id=1291343201649042,presence_status=1(presence_status_online),} 
14:13:29.626 DEBUG ImxConnection[6] org.logicalcobwebs.proxool.ImxDB - 006418 (01/02/00) - Connection #8 served 
14:13:29.626  INFO ImxConnection[6] imx.dbo.ImxOnlineInfoRow - EXEC SQL UPDATE imx_online_info SET last_active_time = '2010-12-03 14:13:29.0' WHERE account = 'zhy' 
14:13:29.627 DEBUG ImxConnection[6] org.logicalcobwebs.proxool.ImxDB - UPDATE imx_online_info SET last_active_time = '2010-12-03 14:13:29.0' WHERE account = 'zhy';  (0 milliseconds) 
14:13:29.653 DEBUG ImxConnection[6] org.logicalcobwebs.proxool.ImxDB - 006418 (00/02/00) - Connection #8 returned (now AVAILABLE) 
Ctrl+C 
[root@web imx_server]# 
 
总结一下:要想跟踪会更名的日志的话,用tail -F 而不是tail -f

tail 显示文件最后若干行内容的更多相关文章

  1. cat 显示文本、less 分屏显示文本、more 分页显示文件、head 显示文件的前面的内容、cut 切割、paste合并、wc用来对文本进行统计、sort排序、权限、关闭文件、vim的使用

    cat 显示文本  -E 显示结尾的$符 -n 对显示的每一行进行编号 -b 对非空行进行编号 -s 对连续的空行进行压缩 tac 倒序显示 less 分屏显示文本 向下翻一屏 空格 向下翻一行 回车 ...

  2. Linux显示文件前几行、拷贝文件前几行、删除文件前几列

    [一]显示文件前几行 ll -lrth:按照更改时间倒序排列,最新文件在下边 ll -lrSh:按照文件大小倒序排列,最大文件在下边 grep --color :高亮查询关键字 grep -A 10 ...

  3. linux tail-在屏幕上显示指定文件的末尾若干行

    博主推荐:获取更多 linux文件内容查看命令 收藏:linux命令大全 tail命令用于输入文件中的尾部内容.tail命令默认在屏幕上显示指定文件的末尾10行.如果给定的文件不止一个,则在显示的每个 ...

  4. inux中tail命令---用于查看文件内容

    linux中tail命令---用于查看文件内容 最基本的是cat.more和less.1. 如果你只想看文件的前5行,可以使用head命令,如:head -5 /etc/passwd2. 如果你想查看 ...

  5. 利用grep参数查看某关键词前后几行内容

    查看文件中含有“哈哈哈”关键字所在行后5行内容 cat xxxxxx | grep -A 5 哈哈哈 查看文件中含有“哈哈哈”关键字所在行前5行内容 cat xxxxxx | grep -B 5 哈哈 ...

  6. WPF设置DataGrid行内容高度自适应 与 TextBox/TextBlock内容高度自适应

    WPF设置DataGrid行内容高度自适应  TextBox/TextBlock内容高度自适应  参考: DataGrid 控件中的调整大小选项: http://msdn.microsoft.com/ ...

  7. 关于SQL Server将一列的多行内容拼接成一行的问题讨论

    http://blog.csdn.net/rolamao/article/details/7745972 昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我 ...

  8. 获取文本文件的第N行内容

    在PowerShell中,可以通过Get-Content这个cmdlet来获取文本文件的内容.Get-Content将一个文本文件读取到一个数组中,每一个数组元素就是文件的一行内容.比如一个文本文件内 ...

  9. SQL Server将一列的多行内容拼接成一行的问题讨论

    转自http://blog.csdn.net/rolamao/article/details/7745972 昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出 ...

随机推荐

  1. Jmeter 学习(三)

    1. 线程组知识 1)Ramp-up period 表示多长时间内建立全部的线程数N 默认为0,表示测试开始即建立全部线程并立即发送访问请求 设置为Ts,表示每隔T/N建立一个线程 注1:一般不设置为 ...

  2. Oralce 账户被锁后的解决办法

    SQL> connect sys/sys as sysdba; 已连接. SQL> alter user system account unlock; 用户已更改.  www.2cto.c ...

  3. 关于前端CSS预处理器Sass的小知识!

    前面的话   "CSS预处理器"(css preprocessor)的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件.SASS是一种CSS的开发工 ...

  4. overflow:hidden 影响布局的问题

    a 与 b 都是 inline-block且高与父元素 c 相同均为 30px,而在a加上 overflow:hidden; 会使 a 的底线与整个父元素 c 的 text baseline 对齐,相 ...

  5. mysql mybatis-generator plugin 分页

    generator.xml配置如下: plugin必须紧跟context,否则会报错 <?xml version="1.0" encoding="UTF-8&quo ...

  6. mysql delete 使用别名 语法

    今天删除数据,写了这么条sql语句, DELETE   from  sys_menus s WHERE s.MENU_ID in (86,87,88); 结果报错.. [Err] 1064 - You ...

  7. css样式之 direction

    今天看到 direction:rtl.一时有点发傻. 其实就是文本读取顺序.默认是ltr从左向右读.rtl是从右向左读取.

  8. jq中数组应用的错误

    js中数组可以这样使用: <ul id="ul"> <li value="1">s</li> <li>f< ...

  9. 20145224&20145238 《信息安全系统设计基础》 第五次实验

    20145224&20145238 <信息安全系统设计基础>第五次实验 课程:信息安全系统设计基础 班级:1452 姓名:陈颢文 荆玉茗 学号:20145224 20145238 ...

  10. AngularJS的$watch用法

    $watch简单使用 $watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你. $watch(watchExpression, listener, objectEqua ...