免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 一梦如是
打印 上一主题 下一主题

如何更巧妙的利用shell的fd [复制链接]

论坛徽章:
0
21 [报告]
发表于 2007-01-09 10:48 |只看该作者
原帖由 awk就是awp加ak 于 2007-1-9 10:12 发表
虽然分开文件读和写指针,没有使用临时文件,从而节省了1/2磁盘空间和1/2磁盘读写量,相对是很大改进。
我的想法是:根本不进行文件块拷贝操作,只是修改文件开始指针,并且重新设置大小。或许有些贪婪了,哈

单独截取的需求,您的想法用:dd设定操作符就完全可以实现,但去掉前10行的需求显然不是单纯一个truncate调用就可以完成的。

论坛徽章:
0
22 [报告]
发表于 2007-01-09 11:00 |只看该作者
原帖由 一梦如是 于 2007-1-9 10:48 发表

单独截取的需求,您的想法用:dd设定操作符就完全可以实现,但去掉前10行的需求显然不是单纯一个truncate调用就可以完成的。

我说的不是截取,也许是打算修改inode吧。不过目前好像没有发现unix提供 inode修改的办法。

论坛徽章:
0
23 [报告]
发表于 2007-01-09 11:03 |只看该作者
也许是对文件系统了解不够才会产生这种想法~

论坛徽章:
0
24 [报告]
发表于 2007-01-09 11:10 |只看该作者
更激进的想法:重新设计inode,增加一个偏移量 st_off,默认0

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
25 [报告]
发表于 2007-01-09 11:17 |只看该作者
原帖由 一梦如是 于 2007-1-9 10:44 发表

...
而且,我发现了我前面的一个观点是错误的:“sed和awk一定将文件指针置为文件尾”,特此声明。
用下面的方法测试
[code]seq 10000 >6
exec 3<6
strace awk 'NR==1 ...

的确是这样,如你所说,fd总会保存文件指针的位置。我前面关于sed、awk退出前将文件指针指向文件尾说法也是错误的。更正一下。

我也用strace跟踪了一下,发现sed、awk、head、perl都是按块读入文件,head的块是8K,其它几个都是4K。按块读取IO性能好,这是不错的,不同的是只有head和perl之后又用lseek恢复了文件指针的正确位置,所以fd中保存的结果才是正确的。

很有收获啊,谢谢梦兄!

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
26 [报告]
发表于 2007-01-09 11:59 |只看该作者
  1. { head -10 <&3; dd <&3 >&4;} 3<HUGEFILE 4<>HUGEFILE
复制代码

我测试了一下,结果没有截断。
GNU bash, version 2.05b.0(1)-release
dd (coreutils) 5.0

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
27 [报告]
发表于 2007-01-09 12:04 |只看该作者
有意思!在我的平台上确实截断了。
bash:version 3.00.15(1)
head&dd: (coreutils) 5.2.1
另一台上也行:
bash:version 2.05b.0(1)
head&dd: (coreutils) 5.2.1
因为coreutils版本不同?
{ head -10 <&3; head -10 <&3;} 3<HUGEFILE显示什么?

[ 本帖最后由 woodie 于 2007-1-9 12:10 编辑 ]

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
28 [报告]
发表于 2007-01-09 12:16 |只看该作者
原帖由 woodie 于 2007-1-9 12:04 发表
有意思!在我的平台上确实截断了。
bash:version 3.00.15(1)
head&dd: (coreutils) 5.2.1
另一台上也行:
bash:version 2.05b.0(1)
head&dd: (coreutils) 5.2.1
因为coreutils版本不同?
{ head ...

  1. r2007@www r2007 $ seq 1 20 >a
  2. r2007@www r2007 $ { head -10 <&3; head -10 <&3;} 3<a
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. 6
  9. 7
  10. 8
  11. 9
  12. 10
  13. 11
  14. 12
  15. 13
  16. 14
  17. 15
  18. 16
  19. 17
  20. 18
  21. 19
  22. 20
  23. r2007@www r2007 $ { head -10 ; dd >&4;} <a 4<>a
  24. 1
  25. 2
  26. 3
  27. 4
  28. 5
  29. 6
  30. 7
  31. 8
  32. 9
  33. 10
  34. 0+1 records in
  35. 0+1 records out
  36. r2007@www r2007 $ cat a
  37. 11
  38. 12
  39. 13
  40. 14
  41. 15
  42. 16
  43. 17
  44. 18
  45. 19
  46. 20
  47. 14
  48. 15
  49. 16
  50. 17
  51. 18
  52. 19
  53. 20
  54. r2007@www r2007 $
复制代码

[ 本帖最后由 r2007 于 2007-1-9 12:20 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
29 [报告]
发表于 2007-01-09 12:18 |只看该作者
那么head没有问题。dd的问题吗?7兄是linux还是cygwin?

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
30 [报告]
发表于 2007-01-09 12:23 |只看该作者
原帖由 woodie 于 2007-1-9 12:18 发表
那么head没有问题。dd的问题吗?7兄是linux还是cygwin?

自己捣鼓得gentoo 1.4 ^_^
我这测试结果,除了不能截断,其它都正常。每次总有个尾巴。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP