【问题标题】:Extract text from output and convert to CSV从输出中提取文本并转换为 CSV
【发布时间】:2014-05-10 17:01:06
【问题描述】:

我有数百台 HP Onboard Administrator 设备要审核固件版本和序列号。我已经设法让 sshpass 和 ssh 远程登录并远程运行“show oa info”命令,这会拉回这些行的输出:

$ sshpass -p password ssh -o UserKnownHostsFile=/dev/null 
-o StrictHostKeyChecking=no logon@OA_Name1 'show oa info'

Onboard Administrator #1 information:
    Product Name  : BladeSystem c7000 DDR2 Onboard Administrator with KVM
    Name          : OA_Name1
    Part Number   : 456204-B21
    Spare Part No.: 503826-001
    Serial Number : 12345678
    UUID          : 12345678
    Manufacturer  : HP
    Firmware Ver. : 3.31 May 23 2011

我想做的是提取某些行并转换为 CSV 数据,以便我可以导出到电子表格以供管理人员查看。

我尝试过使用 grep、sed 和 awk,但到目前为止都失败了,我想知道是否有人可以提供一些帮助?整体输出取决于 HP 软件的版本,但始终包含名称、序列号和固件版本字段

理想情况下,它最终会类似于:

Name,Serial Number,Firmware Ver,
OA_Name1,12345678,3.31 May 23 2011,
OA_Name2,12345678,3.31 May 23 2011,

非常感谢。

戴夫

【问题讨论】:

    标签: linux csv awk sed


    【解决方案1】:

    你需要这样吗?

    yourcommand | sed -n 's/^[ ]*\(Name\|Serial Number\|Firmware Ver.\)[ ]*:\(.*\)/\2/p' | tr '\n' ','
    

    【讨论】:

      【解决方案2】:

      喜欢这个awk:

      yourcommand | awk -F: '/Name/{n=$2} /Serial/{s=$2} /Firmware/{f=$2} END{printf "%s,%s,%s\n",n,s,f}'
      

      所以,如果awk 看到Name,它会将第二个字段保存在变量n 中。如果它看到Serial,它将第二个字段保存在变量s 中。如果它看到Firmware,它会将第二个字段保存在f 中。最后打印 n,s,f。

      -F: 将字段分隔符设置为冒号。

      【讨论】:

      • 为什么将第二个字段保存在变量n而不是第一个?
      • 字段分隔符是冒号,所以它会保存冒号后看到的任何内容,即行中的第二个内容。
      • 我问,为什么它无法存储第一个?
      • 我认为 OP 对第一个不感兴趣。
      • @AvinashRaj 它并没有失败存储第一个。它确实存储了它,但它的值被包含/Name/ 的第二行覆盖。如果您将Product Name 行移到Name 行下方,您将看到此命令将打印BladeSystem 作为输出。
      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 2011-04-04
      • 2023-02-09
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      相关资源
      最近更新 更多