免费注册 查看新帖 |

Chinaunix

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

[文本处理] 关于tailf和break [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-17 11:53 |只看该作者 |倒序浏览
  1. #!/bin/sh
  2. filename=/home/test2/test1.txt
  3. num=1
  4. mark_num=1
  5. while :
  6. do
  7. echo "${mark_num} !!!"
  8. tailf $filename |while read line
  9. do
  10.     echo $filename;echo $num;echo $mark_num
  11.     num=$(($num+1))
  12.     if test $num -eq 5
  13.     then
  14.         mark_num=$(($mark_num+1))
  15.         filename=/home/test2/test${mark_num}.txt
  16.         echo "break "
  17.         break
  18.     fi
  19.     echo $line
  20. done
  21. done
复制代码
很简单的一个程序 有3个文件 test1.txt test2.txt test3.txt
每增长5 读取另一个文件 、、
但是我现在的问题是 test1.txt读取5行后  运行到break 就不动了

以下是调试输出
  1. + filename=/home/test2/test1.txt
  2. + num=1
  3. + mark_num=1
  4. + :
  5. + echo '1 !!!'
  6. 1 !!!
  7. + tailf /home/test2/test1.txt
  8. + read line
  9. + echo /home/test2/test1.txt
  10. /home/test2/test1.txt
  11. + echo 1
  12. 1
  13. + echo 1
  14. 1
  15. + num=2
  16. + test 2 -eq 5
  17. + echo

  18. + read line
  19. + echo /home/test2/test1.txt
  20. /home/test2/test1.txt
  21. + echo 2
  22. 2
  23. + echo 1
  24. 1
  25. + num=3
  26. + test 3 -eq 5
  27. + echo

  28. + read line
  29. + echo /home/test2/test1.txt
  30. /home/test2/test1.txt
  31. + echo 3
  32. 3
  33. + echo 1
  34. 1
  35. + num=4
  36. + test 4 -eq 5
  37. + echo

  38. + read line
  39. + echo /home/test2/test1.txt
  40. /home/test2/test1.txt
  41. + echo 4
  42. 4
  43. + echo 1
  44. 1
  45. + num=5
  46. + test 5 -eq 5
  47. + mark_num=2
  48. + filename=/home/test2/test2.txt
  49. + echo 'break 2'
  50. break 2
  51. + break 2
复制代码

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
2 [报告]
发表于 2013-09-17 12:52 |只看该作者
我只想说:filename=/home/test2/test${mark_num}.txt  这个变量定义是传不到外层循环去的,filename永远是test1.txt

论坛徽章:
0
3 [报告]
发表于 2013-09-17 13:00 |只看该作者
本帖最后由 haofang666777 于 2013-09-17 13:05 编辑
关阴月飞 发表于 2013-09-17 12:52
我只想说:filename=/home/test2/test${mark_num}.txt  这个变量定义是传不到外层循环去的,filename永远是 ...

但是日志每隔一定时间就会写到一个新文件里啊,
也就是文件名字是变的啊。
难道就只能用cat吗?

而且看调试输出 他是到 break 就没输出了啊

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
4 [报告]
发表于 2013-09-17 13:05 |只看该作者
回复 3# haofang666777


你的实际需求是什么?
   

论坛徽章:
0
5 [报告]
发表于 2013-09-17 13:14 |只看该作者
关阴月飞 发表于 2013-09-17 13:05
回复 3# haofang666777

这个。。。
就是处理一些日志文件 每天一个吧 名字就是
2013-09-17.log
可以说一天一个文件吧(虽然可以一天定时运行一次脚本,但是会带来很多不便)
一条时间的格式为
requestTime:2013-07-30 12:02:03,startTime:2013-07-30 12:02:11,callTime:2013-07-30 12:02:12,answerTime:2013-07-30 12:02:12,endTime:2013-07-30 12:02:12

对所有时间进行综合处理,所以要逐条处理,

所以要逐行读取

论坛徽章:
0
6 [报告]
发表于 2013-09-17 13:41 |只看该作者
好像是和管道或者子shell有关吧,
但是用重定向 怎么用tailf啊 ,各种郁闷啊 。。。

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
7 [报告]
发表于 2013-09-17 14:17 |只看该作者
本帖最后由 关阴月飞 于 2013-09-17 14:17 编辑

回复 5# haofang666777


遂行读取用个循环或awk就行了,tailf主要是实时读取文件变化,有实时性的要求么?

haofang666777 发表于 2013-09-17 13:41
好像是和管道或者子shell有关吧,
但是用重定向 怎么用tailf啊 ,各种郁闷啊 。。。

这个可以试试这样:
while read line
do
...
done < <(tailf urfile)  

论坛徽章:
0
8 [报告]
发表于 2013-09-17 14:25 |只看该作者
关阴月飞 发表于 2013-09-17 14:17
回复 5# haofang666777


早就试过了
./test3.sh: line 22: syntax error near unexpected token `('
./test3.sh: line 22: `done<<(tailf $filename)'
哎  是在不行就用cat吧。

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
9 [报告]
发表于 2013-09-17 15:25 |只看该作者
回复 8# haofang666777


#!/bin/sh  ==> #!/bin/bash   

论坛徽章:
0
10 [报告]
发表于 2013-09-17 16:44 |只看该作者
关阴月飞 发表于 2013-09-17 15:25
回复 8# haofang666777

总之非常感谢

那个例子忘记放哪里了(当时随便做的一个小测试,)
用的另外一个类似的例子

结果还是一样啊,
./pg_log_monitor.sh: line 51: syntax error near unexpected token `('
./pg_log_monitor.sh: line 51: `        done<<(tailf ${pg_log_path}$newer_log)'
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP