【问题标题】:How can I format the output of a bash command in neat columns如何在整齐的列中格式化 bash 命令的输出
【发布时间】:2011-09-21 17:12:47
【问题描述】:

我有一个函数可以输出许多我想在列中格式化的信息行。问题是数据的任何特定“单元格”(如果我可以使用该术语)的宽度是可变的,因此将其传递给 awk 之类的东西并不能满足我的需求。

功能是“键”(没关系),我正在尝试这样的事情:

$ keys | awk '{ print $1"\t\t" $2 }'

但输出(即它的一个 sn-p)看起来像这样:

"option-y"      yank-pop
"option-z"      execute-last-named-cmd
"option-|"      vi-goto-column
"option-~"      _bash_complete-word
"option-control-?"      backward-kill-word
"control-_"     undo
"control-?"     backward-delete-char

如何强制内容保持在整齐的列中?用 awk 可以做到这一点,还是我需要使用其他东西?

【问题讨论】:

    标签: bash awk zsh


    【解决方案1】:

    如果您的输出由制表符分隔,一个快速的解决方案是使用tabs 命令来调整制表符的大小。

    tabs 20
    keys | awk '{ print $1"\t\t" $2 }'
    

    【讨论】:

      【解决方案2】:

      试试

      xargs -n2  printf "%-20s%s\n"
      

      甚至

      xargs printf "%-20s%s\n"
      

      如果输入不是很大。

      【讨论】:

      • 对于那些感兴趣的人,对于 4 列数据,对于相同的总宽度 20,这将类似于 xargs printf "%-5s%-5s%-5s%-5s\n"
      【解决方案3】:

      由于 AIX 没有“列”命令,因此我创建了下面的简单脚本。如果没有文档和输入编辑,它会更短...... :)

      #!/usr/bin/perl
      #       column.pl: convert STDIN to multiple columns on STDOUT
      #       Usage: column.pl column-width number-of-columns  file...
      #
      $width = shift;
      ($width ne '') or die "must give column-width and number-of-columns\n";
      $columns = shift;
      ($columns ne '') or die "must give number-of-columns\n";
      ($x = $width) =~ s/[^0-9]//g;
      ($x eq $width) or die "invalid column-width: $width\n";
      ($x = $columns) =~ s/[^0-9]//g;
      ($x eq $columns) or die "invalid number-of-columns: $columns\n";
      
      $w = $width * -1; $c = $columns;
      while (<>) {
              chomp;
              if ( $c-- > 1 ) {
                      printf "%${w}s", $_;
                      next;
              }
              $c = $columns;
              printf "%${w}s\n", $_;
      }
      print "\n";
      

      【讨论】:

        【解决方案4】:

        虽然可以使用awkprintf,但您可能需要查看pr 或(在BSDish 系统上)rs 进行格式化。

        【讨论】:

          【解决方案5】:

          column(1) 是你的朋友。

          $ column -t <<< '"option-y"      yank-pop
          > "option-z"      execute-last-named-cmd
          > "option-|"      vi-goto-column
          > "option-~"      _bash_complete-word
          > "option-control-?"      backward-kill-word
          > "control-_"     undo
          > "control-?"     backward-delete-char
          > '
          "option-y"          yank-pop
          "option-z"          execute-last-named-cmd
          "option-|"          vi-goto-column
          "option-~"          _bash_complete-word
          "option-control-?"  backward-kill-word
          "control-_"         undo
          "control-?"         backward-delete-char
          

          【讨论】:

          • 不错,快速且有用。但是 awk 版本更容易让我对其进行调整以解决另一个问题:拆分除空格以外的其他内容。我试过这个:IFS='" ' ; keys | column -t 但列似乎不尊重 $IFS 的值。
          • @Brandon: IFSshell 的内部字段分隔符,不适用于通过 shell 运行的程序,尽管它们可能使用相同的值( s)..
          • 我知道,主题错了,但是:这对于漂亮的 CSS 打印很有用,它有助于漂亮地对齐 css 语句的属性!
          • 警告:列不喜欢“太长”的行,虽然 man 列提到了 2048 字节的限制,但实际上几百字节就足以扼杀它(至少在 Debian 8.3 上) )。
          • 我可以在命令行上执行此操作,但您如何在脚本函数中执行相同操作? IE:当你在“yank-pop”和随后的新行之后点击回车..
          【解决方案6】:

          通过搜索“linux output formatted columns”找到这个。

          http://www.unix.com/shell-programming-scripting/117543-formatting-output-columns.html

          根据您的需要,就像:

          awk '{ printf "%-20s %-40s\n", $1, $2}'
          

          【讨论】:

          • 我没有在我提供的示例输出中显示这个,但是在某些地方我有我不想想要拆分的空格,所以通过这个小调整到你的 awk sn-p 我已经解决了这个问题:keys | awk 'BEGIN { FS = "\" " } ; { printf "%-20s %-40s\n", $1, $2, $3}'
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-21
          • 2020-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多