避免col的32KB长度限制

时间:2014-01-30 14:53:52

标签: linux bash shell text

我使用python从路由器和交换机屏蔽大量文本,并使用script记录会话。通常我会使用以下内容清理script个会话:

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来解决这个问题,但现在我正在创建许多小文件并在每个文件上执行col。作为一个长镜头,我尝试缓冲mbuffermbuffer -s 8192)和stdbuf,但那些显然无助于这种情况。

问题

是否有:

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

1 我的系统至少有32KB,uname -aLinux 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 我意识到我可以split进入/dev/shm以消除一些磁盘延迟,但如果可能,我想完全避免使用split

1 个答案:

答案 0 :(得分:2)

这是col中的错误。 (我已将它的价值报告给FreeBSDDebian(也应该适用于Ubuntu);随意将报告广播到其他可能拥有自己的源存储库的发行版中)。

据我所知,该错误存在于col实用程序的所有常用版本中,甚至是OpenBSD版本。

错误报告中有一个简单的修复方法,即将c_column的声明从short更改为int。我通过下载debian util-linux source package 1 进行了测试,然后使用以下命令编译它(在ubuntu系统上),从目录开始我下载了tarball:

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选项报告其版本字符串