截断stdin行长?

时间:2020-03-06 14:45:39  来源:igfitidea点击:

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

我写了一个小的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"。 -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";
}