免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6929 | 回复: 17
打印 上一主题 下一主题

请教: tail -f 又一问。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-28 14:41 |只看该作者 |倒序浏览
以前有人问过一个问题:

  1. tail -f urfile|grep string >>myfile
复制代码

这个缓冲区问的问题,今天我正好用到了一个类似的命令,十分不解继续请教。

  1. tail -f urfile |while read a;do echo "$a"|grep string >>result;done
复制代码

这是当年版主给出的答案,我测试的结果是
直接运行
tail -f urfile|grep string
可以看见结果。

问题 1、
直接运行
tail -f urfile|grep --line-buffer string >>myfile
还有缓冲区, --line-buffer 无效 ?
问题 2、
输出到 stdout 好似没有缓冲区,运行
exec 3<&1 >./myfile
tail -f urfile|grep string
仍然无效,myfile 仍然不能取得结果 ?
为啥 stdout 直接显示出来了,而换一个fd就不能?

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2008-07-28 14:53 |只看该作者
1不是不缓冲,而是行缓冲
2区分一下两个概念: stdout /tty

论坛徽章:
0
3 [报告]
发表于 2008-07-28 15:00 |只看该作者
1不是不缓冲区,而是行缓冲
   似乎行缓冲无效,我开两个终端,一个直接输出到标准输出,另一个通过行缓冲输出到文件,屏幕上已经出现10多行了,文件还是空的。
2、 stdout /tty  ?
   我理解 stdout 和 tty 似乎都是一个指针类似的东西,指向一块内存地址,我改变得不过是指针所指向内存地址的位置而已。不知道是否有误,请指正。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
4 [报告]
发表于 2008-07-28 15:11 |只看该作者
1。a.屏幕上输出10多行就是10多行?里面有10多个\n么
seq 1000|tr -d '\n'
在俺的屏幕上输出几十行,但里面一个\n都没有,程序是靠\n判断行的,不是靠眼看
b.你的grep程序支持--line-buffer选项么?

2.谈不上指证,因为没看懂你在说什么

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
5 [报告]
发表于 2008-07-28 15:14 |只看该作者
另外如果你的系统里有unbuffer或pty程序,你可以试试用它们取消grep的缓冲特性

论坛徽章:
0
6 [报告]
发表于 2008-07-28 15:25 |只看该作者
额,好像是明白了,谢谢啊。

       --line-buffered
              Use line buffering, it can be a performance penality.
man grep 里找到的,应该支持吧。

我 tail -f 的是apache 日志。
改了一下测试的语句。
tail -f  urfile |sed -e 's/.*/&\n/'|grep --line-buffer "string"  >>myfile
这样就可以了。

区分一下两个概念: stdout /tty 这不都是一个文件描述符地址吗。
还是不太明白,在说一下好吗。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
7 [报告]
发表于 2008-07-28 15:46 |只看该作者
stdout是个指针,你可以用它让数据流向tty,也可以流向一个普通文件或管道。
tty是终端设备,它是数据流的接受者或产生数据的发生器

论坛徽章:
0
8 [报告]
发表于 2008-07-28 15:52 |只看该作者
学习unbuffer,expect里面带很多工具很有意思
/usr/bin/autoexpect
/usr/bin/dislocate
/usr/bin/expect
/usr/bin/ftp-rfc
/usr/bin/kibitz
/usr/bin/lpunlock
/usr/bin/mkpasswd
/usr/bin/passmass
/usr/bin/rftp
/usr/bin/rlogin-cwd
/usr/bin/timed-read
/usr/bin/timed-run
/usr/bin/unbuffer
/usr/bin/weather
/usr/bin/xkibitz

论坛徽章:
0
9 [报告]
发表于 2008-07-28 16:00 |只看该作者
waker 请教一下
  我把 stdout 指向 tty 没有缓冲,直接输出,而把 stdout 指向文件就存在缓冲,是否说明,缓冲不是在 grep 而是在stdout 所指向的目标里面呢 ?

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
10 [报告]
发表于 2008-07-28 16:11 |只看该作者

回复 #9 xinyv 的帖子

是标准I/O库的特性,当stdout不涉及交互设备时才能是全缓冲的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP