7

我一直在解析一些日志文件,发现有些行太长而无法在一行上显示,因此 Terminal.app 将它们包装到下一行。但是,我一直在寻找一种在一定数量的字符后截断一行的方法,这样终端就不会换行,从而更容易发现模式。

为此,我编写了一个小的 Perl 脚本:

#!/usr/bin/perl

die("need max length\n") unless $#ARGV == 0;

while (<STDIN>)
{
    $_ = substr($_, 0, $ARGV[0]);
    chomp($_);
    print "$_\n";
}

但我有一种感觉,这个功能可能内置在其他一些工具(sed?)中,我只是不太了解用于这项任务。

所以我的问题是一个相反的问题:如何在不编写程序的情况下截断一行标准输入?

4

9 回答 9

12

管道输出到:

cut -b 1-LIMIT

其中 LIMIT 是所需的线宽。

于 2008-09-26T01:50:59.757 回答
11

我用于查看具有很长行的日志文件的另一种策略是将文件通过管道传输到“less -S”。less 的 -S 选项将打印不换行的行,您可以通过按右箭头键查看长行的隐藏部分。

于 2008-09-26T01:53:20.887 回答
2

不完全回答这个问题,但如果你想坚持使用 Perl 并使用单线,一种可能性是:

$ perl -pe's/(?<=.{25}).*//' filename

其中 25 是所需的行长。

于 2008-09-26T03:42:37.427 回答
0

通常的方法是

perl -wlne'print substr($_,0,80)'

打高尔夫球(5.10):

perl -nE'say/(.{0,80})/'

(不要将其视为编程,将其视为使用具有大量选项的命令行工具。)(是的,python参考是故意的。)

于 2008-09-26T07:46:29.790 回答
0

一个 Korn shell 解决方案(截断为 70 个字符 - 不过易于参数化):

typeset -L70 line
while read line
do
  print $line
done
于 2008-09-26T18:24:00.637 回答
0

您可以使用绑定变量将其内容剪辑为固定长度:

#! /usr/bin/perl -w

use strict;
use warnings
use String::FixedLen;

tie my $str, 'String::FixedLen', 4;

while (defined($str = <>)) {
    chomp;
    print "$str\n";
}
于 2008-09-26T21:29:46.667 回答
0

这并不完全是您所要求的,但是GNU Screen(包括在 OS X 中,如果我没记错的话,并且在其他 *nix 系统上很常见)允许您打开/关闭换行(Ca r 和 Ca Cr)。这样,您可以简单地调整终端的大小,而不是通过脚本来传递内容。

Screen 基本上在一个顶级终端应用程序中为您提供“虚拟”终端。

于 2008-09-26T21:54:17.810 回答
0
use strict;
use warnings
use String::FixedLen;

tie my $str, 'String::FixedLen', 4;

while (defined($str = <>)) {
    chomp;
    print "$str\n";
}
于 2009-05-11T14:22:47.183 回答
0

除非我忽略了这一点,否则 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
于 2012-10-15T16:17:21.630 回答