首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将行转换为列

将行转换为列
EN

Unix & Linux用户
提问于 2016-01-28 19:46:59
回答 2查看 24.2K关注 0票数 12

我有一个文件,其中包括虚拟机在管理程序中运行的详细信息。我们运行一些命令并将输出重定向到一个文件。以及以下格式提供的is数据。

代码语言:javascript
复制
Virtual Machine : OL6U5
        ID     : 0004fb00000600003da8ce6948c441bb
        Status : Running
        Memory : 65536
        Uptime : 17835 Minutes
        Server : MyOVS1.vmorld.com
        Pool   : HA-POOL
        HA Mode: false
        VCPU   : 16
        Type   : Xen PVM
        OS     : Oracle Linux 6
Virtual Machine : OL6U6
        ID     : 0004fb00000600003da8ce6948c441bc
        Status : Running
        Memory : 65536
        Uptime : 17565 Minutes
        Server : MyOVS2.vmorld.com
        Pool   : NON-HA-POOL
        HA Mode: false
        VCPU   : 16
        Type   : Xen PVM
        OS     : Oracle Linux 6
Virtual Machine : OL6U7
        ID     : 0004fb00000600003da8ce6948c441bd
        Status : Running
        Memory : 65536
        Uptime : 17835 Minutes
        Server : MyOVS1.vmorld.com
        Pool   : HA-POOL
        HA Mode: false
        VCPU   : 16
        Type   : Xen PVM
        OS     : Oracle Linux 6

由于在某些虚拟机监控程序上运行了50 + vms,所以这种输出因系统管理程序而不同。上面的文件只是虚拟机管理程序中的一个示例,我们只有3个VM在运行,因此重定向的文件应该包含关于几个VM(N个VM)的信息。

我们需要使用awk/sed或使用shell脚本以以下格式获取这些详细信息

代码语言:javascript
复制
Virtual_Machine  ID                                Status   Memory  Uptime  Server              Pool        HA     VCPU  Type     OS
OL6U5            0004fb00000600003da8ce6948c441bb  Running  65536   17835   MyOVS1.vmworld.com  HA-POOL     false  16    Xen PVM  Oracle Linux 6
OL6U6            0004fb00000600003da8ce6948c441bc  Running  65536   17565   MyOVS2.vmworld.com  NON-HA-POOL     false  16    Xen PVM  Oracle Linux 6
OL6U5            0004fb00000600003da8ce6948c441bd  Running  65536   17835   MyOVS1.vmworld.com  HA-POOL     false  16    Xen PVM  Oracle Linux 6
EN

回答 2

Unix & Linux用户

发布于 2016-01-28 20:27:45

编辑:在一个简单的一行for循环中,可扩展到任意数量的输出行:

代码语言:javascript
复制
for ((i=1;i<=2;i++)); do cut -d: -f "$i" input | paste -sd: ; done | column -t -s:

原始答案:

您可以使用bash进程替换作为一个一行程序来完成此操作:

代码语言:javascript
复制
paste -sd: <(cut -d: -f1 input) <(cut -d: -f2 input) | column -t -s:

-s选项paste使它一次处理每个文件。:paste中设置的分隔符在最后被-s选项“捕捉”到column,以便通过使字段对齐来修饰格式。

两个进程替换中的cut命令分别提取第一个字段和第二个字段。

输入中是否有空行并不重要,因为column -t -s:会清除输出。(在问题中指定的原始输入中有空行,但从那以后它们就被删除了。无论空行如何,上面的命令都可以工作。)

输入-上述命令中名为“输入”的文件的内容:

代码语言:javascript
复制
Virtual_Machine:OL6U7

ID:0004fb00000600003da8ce6948c441bd

Status:Running

Memory:65536

Uptime:17103

Server:MyOVS1.vmworld.com

Pool:HA-POOL

HA:false

VCPU:16

Type:Xen PVM

OS:Oracle Linux 6

输出:

代码语言:javascript
复制
Virtual_Machine  ID                                Status   Memory  Uptime  Server              Pool     HA     VCPU  Type     OS
OL6U7            0004fb00000600003da8ce6948c441bd  Running  65536   17103   MyOVS1.vmworld.com  HA-POOL  false  16    Xen PVM  Oracle Linux 6
票数 7
EN

Unix & Linux用户

发布于 2017-07-20 18:32:47

cat <(head -n 11 virtual.txt | cut -d: -f1) <(sed 's/.*: //' virtual.txt) | xargs -d '\n' -n 11 | column -t

在这种情况下,每个虚拟机的行数是硬编码的- 11行。在此情况下,最好先将其计数并存储到变量中,然后在代码中使用此变量。

解释

  1. cat <(command 1) <(command 2) - <()结构使command输出显示为临时文件。因此,cat将两个文件连接起来,并将其进一步管道化。
    • 命令1:head -n 11 virtual.txt | cut -d: -f1,为我们提供未来的列标题。一个虚拟机条目是前11行,使用head命令来获取它。cut将该条目拆分为两列,并打印唯一的第一列。
    • 命令2:sed 's/.*: //' virtual.txt -给出未来的列值。sed删除所有不需要的文本,只留下值。

  2. xargs -d '\n' -n 11。每个输入项都以换行符结束。此命令获取项,并按每行11次打印它们。
  3. column -t -是漂亮的打印显示器所需要的.它以表格形式显示我们的行。否则,每一行将是不同的宽度。

输出

代码语言:javascript
复制
Virtual  Machine                           ID       Status  Memory  Uptime   Server             Pool         HA     Mode  VCPU  Type  OS
OL6U5    0004fb00000600003da8ce6948c441bb  Running  65536   17835   Minutes  MyOVS1.vmorld.com  HA-POOL      false  16    Xen   PVM   Oracle  Linux  6
OL6U6    0004fb00000600003da8ce6948c441bc  Running  65536   17565   Minutes  MyOVS2.vmorld.com  NON-HA-POOL  false  16    Xen   PVM   Oracle  Linux  6
OL6U7    0004fb00000600003da8ce6948c441bd  Running  65536   17835   Minutes  MyOVS1.vmorld.com  HA-POOL      false  16    Xen   PVM   Oracle  Linux  6
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/258361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档