【问题标题】:Get values from two rows and convert to variables从两行获取值并转换为变量
【发布时间】:2013-08-29 18:15:42
【问题描述】:

我有两行的值,想要获取所有值并将它们变成变量。

输出来自 emc 存储:

Bus 0 Enclosure 0  Disk 0
State:                   Enabled

Bus 0 Enclosure 0  Disk 1
State:                   Enabled

预期结果:

Bus:0|Enclosure:0|Disk:0|State:Enabled

或者只是需要有人指导我如何获得最后一行...

【问题讨论】:

    标签: perl sed awk grep


    【解决方案1】:

    这可能对你有用(GNU sed):

    sed '/^Bus/!d;N;s/[0-9]\+/:&|/g;s/\s//g' file
    

    只获取最后一行:

    sed '/^Bus/{N;h};$!d;x;s/[0-9]\+/:&|/g;s/\s//g' file
    

    【讨论】:

      【解决方案2】:

      试试这个 awk:

      $ awk '/^Bus/{for(i=1;i<=NF;i+=2) printf "%s:%s|", $i,$(i+1)}/^State/{printf "%s%s\n", $1, $2}' file
      Bus:0|Enclosure:0|Disk:0|State:Enabled
      Bus:0|Enclosure:0|Disk:1|State:Enabled
      

      要处理最后一个字段中的多个单词,您可以这样做:

      $ awk '/^Bus/{for(i=1;i<=NF;i+=2) printf "%s:%s|", $i,$(i+1)}/^State/{printf "%s", $1; for (i=2;i<=NF;i++) printf "%s ", $i; print ""}' file
      Bus:0|Enclosure:0|Disk:0|State:Enabled 
      Bus:0|Enclosure:0|Disk:1|State:hot space
      

      【讨论】:

      • 可能可以扩展脚本,例如,如果未启用最新单词,例如:Hot Spare,那么我们应该只看到“Hot”。在最后一列之后如何改进以获取所有内容?
      【解决方案3】:
      perl -00anE 's/:// for @F; say join "|", map { $_%2 ? () : "$F[$_]:$F[$_+1]" } 0..$#F' file
      

      输出

      Bus:0|Enclosure:0|Disk:0|State:Enabled
      Bus:0|Enclosure:0|Disk:1|State:Enabled
      

      【讨论】:

        【解决方案4】:

        使用GNU awk,您可以这样做:

        $ awk 'NR>1{$6=$6$7;NF--;print RS,$0}' RS='Bus' OFS='|' file
        Bus|0|Enclosure|0|Disk|0|State:Enabled
        Bus|0|Enclosure|0|Disk|1|State:Enabled
        

        并且只针对最后一行:

        $ awk 'END{$6=$6$7;NF--;print RS,$0}' RS='Bus' OFS='|' file
        Bus|0|Enclosure|0|Disk|1|State:Enabled
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多