2008-09-26 16 views
7

Przeglądałem niektóre pliki dziennika i odkryłem, że niektóre linie są zbyt długie, aby wyświetlić je w jednym wierszu, więc Terminal.app łaknie je na kolejną linię. Jednak szukałem sposobu na obcinanie linii po określonej liczbie znaków, aby terminal nie zawijał, co znacznie ułatwiłoby wykrywanie wzorców.Skracać długość linii stdin?

napisałem mały skrypt Perla, aby to zrobić:

#!/usr/bin/perl 

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

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

Ale mam wrażenie, że ta funkcja jest zbudowany prawdopodobnie w niektórych innych narzędzi, które po prostu nie wiem wystarczająco dużo o do? (SED) użyć do tego zadania.

Moje pytanie typu odwrotne pytanie: w jaki sposób skracać linię stdin BEZ pisania programu, aby to zrobić?

+0

Jak to „nie programowania związanego”? –

+0

Oczywiście jest to związane z programowaniem.Po co to zamykać? –

+0

Po prostu potrzebowałem szybkiej i brudnej odpowiedzi - ponownie ją otworzyłem, więc możesz wnieść swój wkład. Powodem, dla którego nie było to związane z programowaniem, było użycie narzędzia wiersza polecenia zamiast programu. –

Odpowiedz

12

wyjście rury do:

cut -b 1-LIMIT 

ograniczają się pożądaną szerokość linii.

+3

Uwaga: spowoduje to policzenie bajtów. Ponieważ pytał o postacie, dlaczego nie "wyciąć -c"? – Turadg

11

Inną taktyką, której używam do przeglądania plików dziennika z bardzo długimi liniami, jest przekierowanie pliku do "less -S". Opcja -S dla less powoduje drukowanie linii bez zawijania, a widok ukrytej części długich linii można wyświetlić, naciskając klawisz strzałki w prawo.

2

Niezupełnie odpowiadając na pytanie, ale jeśli chcesz, aby trzymać z Perl i użyć jednego-liner, możliwość jest:

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

gdzie 25 jest pożądaną długość linii.

+0

Sprytne wyrażenie regularne, ale ja/chciałem uciec od programowych rozwiązań. –

0

Zwykłym sposobem na to byłoby

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

grałem (na 5.10):

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

(Nie myśleć o tym jak programowanie, pomyśl o tym, jak za pomocą wiersza polecenia narzędzie z ogromną liczbą opcji.) (Tak, odniesienie python jest zamierzone.)

0

Rozwiązanie powłoki Korn (obcinanie do 70 znaków - łatwe do sparametryzowania):

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

Można użyć zmiennej wiązanej że klipy jego zawartość do stałej długości:

#! /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

To nie jest dokładnie to, o co prosisz o, ale GNU Screen (dołączony OS X, jeśli Dobrze pamiętam i często w innych systemach * nix) pozwala włączyć/wyłączyć owijanie linii (Ca r i Ca Cr). W ten sposób można po prostu zmienić rozmiar terminalu, zamiast przeciągać przez skrypt.

Ekran w zasadzie daje "wirtualne" terminale w ramach jednej aplikacji terminalowej.

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

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

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

chyba że jestem brakuje punktu, UNIX „spasować” polecenie zostało zaprojektowane, aby dokładnie to zrobić:

$ 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

Jest to w zasadzie przeciwieństwo tego, czego szukałem. Podczas przeglądania linii pliku dziennika na przykład, jest denerwujące, gdy tekst jest zawijany na wiele linii. Celem tego pytania było ustalenie, czy istnieje sposób obcięcia linii wyjściowych, aby nie było żadnego zawijania. Z twojego przykładu wynika, że ​​zadaniem zwijania jest * powodowanie * zawijania linii. –

+0

Ach, myślałem, że jesteś po prostu niezadowolony ze sposobu, w jaki linie owinięte nie fakt, że owinięte. Wtedy cięcie jest właściwe i możesz użyć eval $ (ttype-s), aby automatycznie ustawić zmienną COLUMNS dla szerokości cięcia, jeśli chcesz. –