我一直在解析一些日志文件,我发现有些行太长而无法显示在一行上,所以Terminal.app将它们包装到下一行。但是,我一直在寻找一种方法来截断一定数量的字符之后的一行,以便终端不会换行,从而更容易发现模式。
我写了一个小的Perl脚本来做到这一点:
#!/usr/bin/perl
die("need max length\n") unless $#ARGV == 0;
while (<STDIN>)
{
$_ = substr($_, 0, $ARGV[0]);
chomp($_);
print "$_\n";
}
但我有一种感觉,这个功能可能内置于其他一些工具(sed?),我只是不知道该用于此任务。
所以我的问题是一个相反的问题:如何在不编写程序的情况下截断stdin行?
管道输出到:
cut -b 1-LIMIT
LIMIT是所需的线宽。
我用来查看具有很长行的日志文件的另一种策略是将文件传递给“less -S”。 less的-S选项将打印行而不包装,您可以通过按右箭头键查看长行的隐藏部分。
不完全回答这个问题,但是如果你想坚持使用Perl并使用单行,那么可能性是:
$ perl -pe's/(?<=.{25}).*//' filename
其中25是所需的线长。
通常的方法是这样做
perl -wlne'print substr($_,0,80)'
高尔夫球(5.10):
perl -nE'say/(.{0,80})/'
(不要将其视为编程,将其视为使用具有大量选项的命令行工具。)(是的,python引用是有意的。)
一个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 Screen(包含在OS X中,如果我没记错,在其他* nix系统中常见)可以让你打开/关闭换行(C-a r和C-a C-r)。这样,您可以简单地调整终端的大小,而不是通过脚本来管理内容。
屏幕基本上为您提供一个顶级终端应用程序中的“虚拟”终端。
use strict;
use warnings
use String::FixedLen;
tie my $str, 'String::FixedLen', 4;
while (defined($str = <>)) {
chomp;
print "$str\n";
}
除非我忽略了这一点,否则UNIX“fold”命令的目的就是:
$ 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