2008-09-26 9 views
7

Ich habe einige Protokolldateien analysiert und festgestellt, dass einige der Zeilen zu lang sind, um in einer Zeile angezeigt zu werden, sodass Terminal.app sie in der nächsten Zeile umschließt. Ich habe jedoch nach einer Möglichkeit gesucht, eine Zeile nach einer bestimmten Anzahl von Zeichen abzuschneiden, so dass Terminal nicht umgebrochen wird, wodurch das Erkennen von Mustern wesentlich erleichtert wird.Stdin Linienlänge abschneiden?

Ich schrieb einen kleinen Perl-Skript, dies zu tun:

#!/usr/bin/perl 

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

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

Aber ich habe das Gefühl, dass diese Funktionalität wahrscheinlich in einige anderen Tools gebaut ist, dass ich weiß nicht, gerade genug, um zu (sed?) Verwenden Sie für diese Aufgabe.

Also meine Frage eine Art umgekehrte Frage: Wie trenne ich eine Zeile von stdin OHNE ein Programm zu schreiben, um es zu tun?

+0

Wie ist das ‚nicht Programmierung verbunden sind‘? –

+0

Natürlich ist es programmierend.Warum schließen Sie es? –

+0

Ich brauchte nur eine schnelle und dreckige Antwort - ich habe sie wieder geöffnet, also fühlen Sie sich frei, etwas beizutragen. Der Grund, warum dies nicht "programmierungsbezogen" war, lag darin, dass ein Befehlszeilentool anstelle eines Programms verwendet wurde. –

Antwort

12

Rohrausgang:

cut -b 1-LIMIT 

LIMIT Wo die Linienbreite gewünscht ist.

+3

Hinweis: Dies zählt Bytes. Da er nach Charakteren fragte, warum nicht "cut-c"? – Turadg

11

Eine andere Taktik, die ich zum Anzeigen von Protokolldateien mit sehr langen Zeilen verwende, besteht darin, die Datei nach "weniger -S" zu leiten. Die Option -S für weniger Zeilen druckt Zeilen ohne Umbruch und Sie können den verborgenen Teil von langen Zeilen anzeigen, indem Sie die Nach-rechts-Taste drücken.

2

Nicht gerade die Frage zu beantworten, aber wenn man mit Perl halten wollen und verwenden Sie einen Einzeiler, eine Möglichkeit ist:

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

wo 25 die Leitungslänge erwünscht ist.

+0

Clever Regex, aber ich bin/war auf der Suche nach programmatischen Lösungen. –

0

Der üblicher Weg, dies zu tun

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

golfed (für 5.10) wäre:

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

(Denken Sie nicht, es als Programmierung, eine Befehlszeile daran denken, wie mit Werkzeug mit einer großen Anzahl von Optionen.) (Ja, die python Referenz ist beabsichtigt.)

0

Eine Korn-Shell-Lösung (auf 70 Zeichen abgeschnitten - einfach zu parametrisieren):

typeset -L70 line 
while read line 
do 
    print $line 
done 
0

Sie können eine gebundene Variable verwenden, dass Clips seinen Inhalt auf eine feste Länge:

#! /usr/bin/perl -w 

use strict; 
use warnings 
use String::FixedLen; 

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

while (defined($str = <>)) { 
    chomp; 
    print "$str\n"; 
} 
0

Dies ist nicht genau das, was Sie fragen, aber GNU Screen (mit OS X enthalten, wenn Ich erinnere mich richtig, und üblich auf anderen * nix-Systemen) können Sie Zeilenumbruch ein-/ausschalten (Ca r und Ca Cr). Auf diese Weise können Sie einfach die Größe Ihres Terminals ändern, anstatt die Daten durch ein Skript zu leiten.

Bildschirm gibt Ihnen im Grunde "virtuelle" Terminals innerhalb einer Toplevel-Terminal-Anwendung.

0
use strict; 
use warnings 
use String::FixedLen; 

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

while (defined($str = <>)) { 
    chomp; 
    print "$str\n"; 
} 
0

Wenn ich den Punkt bin fehlt, die UNIX „fold“ wurde Befehl ausgelegt, dass genau das zu tun:

$ 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 
+1

Dies ist im Grunde das Gegenteil von dem, was ich gesucht habe. Wenn Sie beispielsweise Zeilen einer Protokolldatei anzeigen, ist es ärgerlich, wenn der Text auf mehrere Zeilen verteilt wird. Der Zweck dieser Frage war es, festzustellen, ob es eine Möglichkeit gab, die Ausgabezeilen zu kürzen, so dass es keinen Umbruch geben würde. Aus Ihrem Beispiel scheint es, dass die Aufgabe von fold * das Umbrechen von Linien ist. –

+0

Ah, ich dachte, du warst nur unglücklich mit der Art, wie die Zeilen umhüllten, nicht die Tatsache, dass sie eingewickelt waren. Dann ist die Schnittlösung die richtige und Sie können eval $ (ttype -s) verwenden, um die COLUMNS-Variable für die Schnittbreite automatisch festzulegen, wenn Sie möchten. –