7

いくつかのログ ファイルを解析したところ、一部の行が長すぎて 1 行に表示できないことがわかったので、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

非常に長い行を含むログ ファイルを表示するために使用するもう 1 つの方法は、ファイルを "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 シェル ソリューション (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 は基本的に、1 つのトップレベル端末アプリケーション内で「仮想」端末を提供します。

于 2008-09-26T21:54:17.810 に答える
0

要点を見逃していない限り、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
于 2012-10-15T16:17:21.630 に答える