linux命令 tail
来源:互联网 发布:淘宝充话费很久不到账 编辑:程序博客网 时间:2024/06/14 20:52
命令格式
tail [OPTION]... [FILE]...
常用选项
-f 查看文件尾部,不退出,等待显示后续追加的新内容。
-F 与-f选项相同,不同的是执行此命令时文件可以不存在。-q 不显示处理信息。
-v 显示详细的处理信息。
-c <数目> 显示的字节数。
-n <行数> 显示行数,默认是10行。
-- pid=PID 与 -f 合用,表示在进程ID,PID死掉之后结束。
-q, --quiet, --silent 从不输出给出文件名的首部。
-s, --sleep-interval=S 与 -f 合用,表示在每次反复的间隔休眠S秒。命令说明
tail命令可以输出文件的尾部内容,默认情况下它显示文件的最后十行。它常用来动态监视文件的尾部内容的增长情况,比如用来监视日志文件的变化。
使用 -f 选项时候,其他任何进程,只要向我们打开的这个文件尾部写了新的内容,它都会予以显示,将来需要监控一个服务的运行的时候,服务在运行过程中都会生成日志文件,使用这个选线可以监控有多少用户正在运行哪些服务。
动态跟踪文件file的增长情况(output appended data as the file grows),tail会每隔一秒去检查一下文件是否增加新的内容,如果增加就追加在原来的输出后面显示。但这种情况,必须保证在执行tail命令时,文件已经存在。
如果想终止tail -f的输出,按Ctrl+C中断tail程序即可。如果按Ctrl+C不能中断输出,那么可以在别的终端上执行killall tail强行终止。
注意:采用tail -f来监控文件变化情况时,在某些情况会不太灵。比如在java应用程序中采用log4j日志时,每隔1个小时生成一个新的日志文件,当前的日志输出在LOG4J.LOG中,当一个小时过去后,log4j会将LOG4J.LOG改名成LOG4J.yyyy-mm-dd-HH的形式。那么这个时候tail -f就不能动态输出新的日志内容了。tail命令本身提供了很多参数,似乎都不能完美的解决这个问题。最后只好编写了一个脚本ftail.sh来跟踪日志,详见《Linux下实时跟踪log4j日志文件的bash脚本 - 增强了tail -f的功能》。
使用示例(以下内容来自codingstandards的博客)
示例一 输出文件尾部
先使用seq命令输出20个数字保存到1.txt,然后尝试使用tail命令。
[root@new55 ~]# seq 20 >1.txt
[root@new55 ~]# cat 1.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@new55 ~]# tail 1.txt
11
12
13
14
15
16
17
18
19
20
[root@new55 ~]# tail -3 1.txt
18
19
20
[root@new55 ~]# tail -n 3 1.txt
18
19
20
[root@new55 ~]# tail --lines=3 1.txt
18
19
20[root@new55 ~]# tail -n +14 1.txt
14
15
16
17
18
19
20
[root@new55 ~]#示例二 动态跟踪tomcat输出
动态跟踪tomcat输出。
[root@web logs]# tail -f catalina.out
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
2010-12-03 13:23:02,236 [http-80-15] DEBUG mhr.roi.MhrManager - MhrGetJobReq={seq=991,job_id='86130469-0006'}
2010-12-03 13:23:02,301 [http-80-15] DEBUG mhr.roi.MhrManager - MhrGetJobRsp={seq=991,result=0(成功),,info={job_id='86130469-0006',employer_id=86130469,employer_name=无锡富士时装有限公司,,,job_title='|570309|',job_title0='文员',job_type=f(全职),issue_time='2010-11-03 00:00:00.0',work_address='1902',work_address0=无锡市,desired_count='1',,,,,,job_desc=大专,1年以上5s管理工作经验,电脑操作熟练。,required_experience=1(一年以上),,,,required_degree=15(大专),,,,,,,valid_days=30,access_count=12,expire_time='2010-12-03 00:00:00.0',job_status=1(过期),,,,,,contact_name=王小姐,contact_number=0510-85550088,remarks='★此职位是从后台导入的
',enter_time='2010-11-03 09:45:11.0',change_time=2010-12-03 02:18:05.0,,job_seq=123201,,required_min_age=22,,,accommodations=面议,serve_principal=wjw12580,job_summary=大专,1年以上5s管理工作经验,电脑操作熟练,,}}
2010-12-03 13:23:02,302 [http-80-15] DEBUG mhr.roi.MhrManager - MhrGetEmployerReq={seq=0,employer_id='86130469'}
2010-12-03 13:23:02,304 [http-80-15] DEBUG mhr.roi.MhrManager - MhrGetEmployerRsp={seq=0,result=0(成功),,info={employer_id='86130469',employer_name=无锡富士时装有限公司,employer_region=1902,employer_address=无锡市滨湖镇山水城科技园8号,,employer_desc=无锡富士时装(集团)有限公司成立于1992年,是中日韩合资企业。主要生产高档针织时装,产品全部外销,连续多年荣获“中国行业500强”、“全国工业重点行业效益十佳企业”、“无锡市百佳企业”等称号。公司总部位于江苏省无锡市滨湖镇山水城科技园,全新的厂房设施,占地面积30亩。公司分别在苏州、泰兴、盐城、徐州设有分厂,集团公司现有职工1500多人,年销售额近3亿元。,,,,,,open_mode=5(系统自动操作),open_time='2010-11-03 09:45:10.0',,,,,contact_name=王小姐,contact_number=0510-85550088,,,,,employer_status=1(已经开通),,,login_password=871386,,agency=false,balance=100.0000,,,,,serve_principal=wjw12580,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,remarks='此帐号由“12580zgz-盐城维克多网络传媒有限公司”导入',enter_time='2010-11-03 09:45:10.0',}}
Ctrl+C
[root@web logs]#示例三 动态跟踪log4j日志
经过我的试验,发现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。
示例四 处理二进制文件
[root@new55 ~]# seq 20 >1.txt
[root@new55 ~]# cat 1.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@new55 ~]# hexdump -C 1.txt
00000000 31 0a 32 0a 33 0a 34 0a 35 0a 36 0a 37 0a 38 0a |1.2.3.4.5.6.7.8.|
00000010 39 0a 31 30 0a 31 31 0a 31 32 0a 31 33 0a 31 34 |9.10.11.12.13.14|
00000020 0a 31 35 0a 31 36 0a 31 37 0a 31 38 0a 31 39 0a |.15.16.17.18.19.|
00000030 32 30 0a |20.|
00000033
[root@new55 ~]# tail -c 10 1.txt | hexdump -C
00000000 0a 31 38 0a 31 39 0a 32 30 0a |.18.19.20.|
0000000a
[root@new55 ~]# tail -c -10 1.txt | hexdump -C
00000000 0a 31 38 0a 31 39 0a 32 30 0a |.18.19.20.|
0000000a
[root@new55 ~]# tail -c +10 1.txt | hexdump -C
00000000 0a 36 0a 37 0a 38 0a 39 0a 31 30 0a 31 31 0a 31 |.6.7.8.9.10.11.1|
00000010 32 0a 31 33 0a 31 34 0a 31 35 0a 31 36 0a 31 37 |2.13.14.15.16.17|
00000020 0a 31 38 0a 31 39 0a 32 30 0a |.18.19.20.|
0000002a
[root@new55 ~]#linux命令目录
- Linux的tail命令
- linux tail 命令详解
- linux tail命令详解
- Linux的tail命令
- LINUX TAIL命令
- Linux tail 命令详解
- linux tail命令详解
- Linux下tail命令
- Linux tail 命令详解
- Linux tail 命令详解
- Linux tail 命令详解
- linux ---tail命令
- Linux tail 命令详解
- Linux tail 命令详解
- linux ---tail命令
- Linux tail 命令详解
- linux tail 命令
- Linux tail 命令详解
- 多维数组与指针简析
- OpenGL非规则多边形(凹多边形,凸多边形)二维纹理映射(填充)
- 通过资源的名称获取资源id
- MPEG2音视频同步AVS
- mongodb原子操作
- linux命令 tail
- [Google 2017 Apac] Robot Rock Band
- 多字段表单POST时,数据被截断问题,原因是max_input_vars限制
- UE4——HelloWorld
- 08、js内的数据类型转换
- 设计模式——命令模式
- hdu1005(循环节的经典问题)
- Java内存模型
- 正则表达式验证url、时间、ip