我一直在通过解析一些日志文件,我已经发现,某些行太长,所以敬请Terminal.app它们包装到下一行上显示一行。 不过,我一直在寻找一种方式来截断一定数目的字符,使终端不换行的后面的线,使得它更容易发现其中的规律。
我写了一个小Perl脚本来做到这一点:
#!/usr/bin/perl
die("need max length\n") unless $#ARGV == 0;
while (<STDIN>)
{
$_ = substr($_, 0, $ARGV[0]);
chomp($_);
print "$_\n";
}
但是我有一种感觉,这个功能可能被内置到一些其他的工具(SED?),我只是不知道有足够的了解使用此任务。
所以我的问题排序相反的问题:我怎么截断线标准输入的不编写一个程序来做到这一点?
我使用的浏览很长的线日志文件另一个策略是管道中的文件,以“少-S”。 少-S选项将打印线没有包装,你可以通过按下右箭头键查看排长队隐藏的部分。
不完全回答这个问题,但如果你想坚持使用Perl和使用一个内胆,一种可能性是:
$ perl -pe's/(?<=.{25}).*//' filename
其中图25是所希望的线的长度。
通常的方式做这将是
perl -wlne'print substr($_,0,80)'
Golfed(5.10):
perl -nE'say/(.{0,80})/'
(不要把它想成编程,认为它是使用带有选项的数量庞大的一个命令行工具。)(是的, 蟒蛇参考是故意的。)
一个Korn shell的溶液(截断为70个字符 - 容易,虽然参数):
typeset -L70 line
while read line
do
print $line
done
您可以使用捆绑变量,剪辑其内容为固定长度:
#! /usr/bin/perl -w
use strict;
use warnings
use String::FixedLen;
tie my $str, 'String::FixedLen', 4;
while (defined($str = <>)) {
chomp;
print "$str\n";
}
这不是你问什么了,但GNU屏幕 (包括在OS X,如果我没有记错,以及其他* nix系统常见),让您打开自动换行开/关(CA R和钙铬)。 这样一来,你可以简单地通过脚本调整你的终端,而不是管道的东西。
屏幕基本上给出了一个顶级终端应用程序中,你的“虚拟”终端。
use strict;
use warnings
use String::FixedLen;
tie my $str, 'String::FixedLen', 4;
while (defined($str = <>)) {
chomp;
print "$str\n";
}
除非我错过了点,UNIX的“折叠”命令的目的是要做到这些:
$ cat file
the quick brown fox jumped over the lazy dog's back
$ fold -w20 file
the quick brown fox
jumped over the lazy
dog's back
$ fold -w10 file
the quick
brown fox
jumped ove
r the lazy
dog's bac
k
$ fold -s -w10 file
the quick
brown fox
jumped
over the
lazy
dog's back