避免col的32KB长度限制

我使用python来屏蔽从路由器和交换机中的大量文本,并用脚本logging会话。 通常我用以下方法清理脚本会话:

touch a_clean_script_file.txt; col -bx <a_script_file.tmp > a_clean_script_file.txt 

由于我不想涉及的原因,我发现了一个问题。 col每行的最大限制为32KB 1

 [mpenning@hostname tmp]$ ### 128KB characters, using normal shell pipes [mpenning@hostname tmp]$ printf 'z%.0s' {1..131072} | wc -c 131072 [mpenning@hostname tmp]$ ### 128KB characters, using col (limited to 32KB) <---- [mpenning@hostname tmp]$ printf 'z%.0s' {1..131072} | col -bx | wc -c 32769 [mpenning@hostname tmp]$ 

很明显,我可以使用split -b来解决这个问题,但是现在我正在创build许多小文件,并在其中的每一个上执行。 作为一个长期的尝试,我尝试了通过mbuffer ( mbuffer -s 8192 )和stdbuf缓冲 ,但是这些显然没有帮助。

有没有:

  • col的替代scheme不具有每行32KB的限制?
  • 一种分割长文本行的方法,不通过分割写入许多临时文件? 2

1 至less在我的系统上是32KB, uname -a Linux hostname 2.6.32-431.1.2.0.1.el6.x86_64 #1 SMP Fri Dec 13 13:06:13 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

2 我意识到我可以拆分成/dev/shm来消除一些磁盘延迟,但是如果可能的话,我想尽量避免拆分 。

这是一个错误的col 。 (我已经向FreeBSD和Debian报告过 (这也应该适用于Ubuntu);随意将报告广播给其他可能有自己的源代码库的发行版)。

据我所知,这个bug在所有常用版本的col工具,甚至是OpenBSD版本中都有。

bug报告中有一个简单的修复, c_column的声明从short更改为int 。 我通过下载debian util-linux 源码包 1来测试 ,然后使用下面的命令编译它(在ubuntu系统上),从我下载tar包的目录开始:

 tar xf util-linux_2.20.1.orig.tar.gz cd util-linux_2.20.1 CPPFLAGS=-I/usr/include/ncursesw ./configure cd text-utils # edit line 81 of text-utils/col.c, s/short/int/ make col 

1 为了什么是值得的,我以后才发现这不是debian col工具的来源; 我看到的主要区别是这个报告它的版本字符串与-V选项