【问题标题】:How to print values on single line如何在单行上打印值
【发布时间】:2014-04-10 23:50:22
【问题描述】:

我在命令行上有以下查询,我希望输出值显示在单行上,以便我可以将它提供给我的监控系统,我想知道如何通过 perl 、 sed 来完成此操作,awk

我的命令行

activemq:query  -QQueue=PCA --view QueueSize,ConsumerCount,EnqueueCount,DequeueCount

输出

ConsumerCount = 1
QueueSize = 0
DequeueCount = 148248
EnqueueCount = 148248

想要的输出

1 0 148248 148248

谢谢

【问题讨论】:

    标签: perl sed awk


    【解决方案1】:

    使用命令行开关很有趣:

    perl -anwe'print "$F[2] "'
    

    -a 在空白处自动拆分行,从而去除换行符。我们添加一个空格并打印最后一个字段。

    【讨论】:

      【解决方案2】:

      通过管道将其传输到 awk:

      ... | awk -F= '{printf "%s",$2}'
      

      根据需要输出:

      1 0 148248 148248
      

      【讨论】:

      • 比我的好多了。 +1 另一个坏了:... | cut -d= -f2 | tr -d '\n'
      • 为什么不发布这个作为替代品?
      • 不,为什么要发布一个劣质的解决方案来解决 awk 的美 :-)
      • 非常感谢您的帮助:D
      【解决方案3】:

      这是另一个。保持在数组中推送值,并在最后打印整个数组。这会在最后给你一个换行符。

      但是,如果您的文件非常大,这并不理想。在这种情况下,请使用TLP's狡猾的单线。

      ... | perl -lane 'push @a, $F[2] }{ print "@a"'
      

      【讨论】:

        【解决方案4】:

        Perl 版本:

        ... | perl -l40 -ane 'print $F[2]'
        

        或(Perl 5.8.8)

        ... | perl -ne 'chomp; split /=/; print $_[1]'
        

        注意:Since Perl 5.12.0,“在标量或空上下文中调用时,split() 不再修改 @_”,因此第二个版本不适用于 Perl >= 5.12.0,但第一个版本应该仍然有效。

        测试:

        $ cat t00.txt 
        ConsumerCount = 1
        QueueSize = 0
        DequeueCount = 148248
        EnqueueCount = 148248
        
        $ cat t00.txt | perl -ne 'chomp; split /=/; print $_[1]'
         1 0 148248 148248
        
        $ cat t00.txt | perl -l40 -ane 'print $F[2]'
        1 0 148248 148248 
        

        【讨论】:

        • 您的代码仍然不起作用。您应该在发布之前运行它们。在第一种情况下,您需要使用$F[1],因为@_ 数组是空的。在第二种情况下,您需要使用$F[1],因为@F 数组只包含2 项。我还建议使用-w,即使在单行中也是如此,因为它会给出重要的警告。
        • @LeeDuhem +1 用于拆分,即使它已被弃用。 Use of implicit split to @_ is deprecated
        • 当我运行第一个时,我得到Useless use of split in void context at -e line 1. Use of uninitialized value in print at -e line 1, <> line 1. 等等。第二个现在可以工作了,因为你删除了-F=。如果您的 Perl 版本允许隐式拆分为 @_,第一个可能可以工作,但我听说这种情况已经 10 年了,而且它也已被弃用。
        • 如果你想跳过-a开关,你可以做(split /=/)[1]。非常巧妙地使用了-l40。我花了一段时间才注意到,但它实际上在这种情况下效果很好。
        • @TLP 自 Perl 5.12.0 起,“split() 在标量或空上下文中调用时不再修改 @_。”
        猜你喜欢
        • 1970-01-01
        • 2019-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多