【问题标题】:How to truncate STDIN line length?如何截断 STDIN 行长度?
【发布时间】:2010-09-13 07:58:24
【问题描述】:

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

为此我编写了一个小的 Perl 脚本:

#!/usr/bin/perl

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

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

但我有一种感觉,这个功能可能内置在其他一些工具(sed?)中,我只是不太了解如何用于这项任务。

所以我的问题是一个相反的问题:如何在不编写程序的情况下截断一行标准输入?

【问题讨论】:

  • 这“与编程无关”如何?
  • 当然是和编程有关的。为什么要关闭它?
  • 我只需要一个快速而粗略的答案 - 我已经再次打开它,所以请随时贡献。这不是“与编程相关”的原因是因为它涉及使用命令行工具代替程序。

标签: perl cut truncate


【解决方案1】:

管道输出到:

cut -b 1-LIMIT

其中 LIMIT 是所需的线宽。

【讨论】:

  • 注意:这将计算字节数。既然他要人物,那为什么不cut -c呢?
【解决方案2】:

我用于查看具有很长行的日志文件的另一种策略是将文件通过管道传输到“less -S”。 less 的 -S 选项将打印不换行的行,您可以通过按右箭头键查看长行的隐藏部分。

【讨论】:

    【解决方案3】:

    不完全回答这个问题,但如果你想坚持使用 Perl 并使用单线,一种可能性是:

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

    其中 25 是所需的行长。

    【讨论】:

    • 聪明的正则表达式,但我/正在寻求摆脱程序化解决方案。
    【解决方案4】:

    通常的做法是

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

    打高尔夫球(适用于 5.10):

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

    (不要将其视为编程,将其视为使用具有大量选项的命令行工具。)(是的,python 引用是故意的。)

    【讨论】:

      【解决方案5】:

      Korn shell 解决方案(截断为 70 个字符 - 但易于参数化):

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

      【讨论】:

        【解决方案6】:

        您可以使用绑定变量将其内容剪辑为固定长度:

        #! /usr/bin/perl -w
        
        use strict;
        use warnings
        use String::FixedLen;
        
        tie my $str, 'String::FixedLen', 4;
        
        while (defined($str = <>)) {
            chomp;
            print "$str\n";
        }
        

        【讨论】:

          【解决方案7】:

          这并不完全符合您的要求,但 GNU Screen(包含在 OS X 中,如果我没记错的话,并且在其他 *nix 系统上很常见)可以让您打开/关闭换行(C r 和钙铬)。这样,您可以简单地调整终端的大小,而不是通过脚本来传递内容。

          屏幕基本上在一个顶级终端应用程序中为您提供“虚拟”终端。

          【讨论】:

            【解决方案8】:
            use strict;
            use warnings
            use String::FixedLen;
            
            tie my $str, 'String::FixedLen', 4;
            
            while (defined($str = <>)) {
                chomp;
                print "$str\n";
            }
            

            【讨论】:

              【解决方案9】:

              除非我没有抓住重点,否则 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
              

              【讨论】:

              • 这基本上与我所寻找的相反。例如,在查看日志文件的行时,将文本换成多行会很烦人。这个问题的目的是确定是否有办法截断输出行,这样就不会有任何换行。从您的示例来看,折叠的任务似乎是导致换行。
              • 啊,我以为你只是对线条的缠绕方式不满意,而不是它们缠绕的事实。那么剪切解决方案是正确的,如果您愿意,您可以使用 eval $(ttype -s) 自动设置剪切宽度的 COLUMNS 变量。
              猜你喜欢
              • 2020-12-05
              • 2012-03-25
              • 1970-01-01
              • 1970-01-01
              • 2011-10-02
              • 2022-01-07
              • 2021-05-09
              • 1970-01-01
              • 2018-01-14
              相关资源
              最近更新 更多