2008-09-26 78 views
7

我一直在解析一些日誌文件,我發現一些行太長而無法在一行上顯示,所以Terminal.app將它們包裝到下一行。但是,我一直在尋找一種方法來在一定數量的字符之後截斷一行,這樣Terminal就不會換行,這使得更容易找到模式。截斷stdin行的長度?

我寫了一個小Perl腳本來做到這一點:

#!/usr/bin/perl 

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

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

但我有一種感覺,這個功能可能被內置到一些其他的工具,我只是不知道有足夠的瞭解,以(SED?)用於此任務。

所以我的問題是一個相反的問題:我如何截斷一行stdin沒有寫一個程序來做到這一點?

+0

這是怎麼回事「而不是編程相關」? – 2008-09-26 01:53:54

+0

當然它與編程有關。爲什麼要關閉它? – 2008-09-26 01:54:08

+0

我只需要一個快速而骯髒的答案 - 我已經打開它,所以隨時提供幫助。之所以這不是「編程相關」,是因爲它涉及使用命令行工具代替程序。 – 2008-09-26 02:03:43

回答

12

管道輸出到:

cut -b 1-LIMIT 

其中限制是所期望的線寬度。

+3

注意:這將計算字節數。既然他要求角色,爲什麼不``切割-c`? – Turadg 2011-07-29 15:21:04

11

我用於查看長行很長的日誌文件的另一種策略是將文件傳輸到「less -S」。 -S選項較少將打印沒有包裝的線條,您可以通過按下右箭頭鍵查看長線條的隱藏部分。

2

不完全回答這個問題,但如果你想堅持使用Perl和使用一個內膽,一種可能性是:

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

,其中25是所需的線路長度。

0

通常的方式做,這將是

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

Golfed(5.10):

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

(不要把它想成編程,認爲它是使用命令行)(是的,python參考是故意的。)

0

Korn殼解決方案(截斷爲70個字符 - 雖然易於參數化):

typeset -L70 line 
while read line 
do 
    print $line 
done 
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"; 
} 
0

這不正是你問什麼,而是包含在OS X GNU Screen(如果我記得正確,並且在其他* nix系統上通用)可以讓你打開/關閉換行(Ca r和Ca Cr)。這樣,你可以簡單地調整你的終端的大小,而不是通過腳本來管道。

屏幕基本上給你一個頂級終端應用程序內的「虛擬」終端。

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

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

while (defined($str = <>)) { 
    chomp; 
    print "$str\n"; 
} 
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