我有一个输出问题。
所以我有一个命令的输出。
$ sudo /opt/MegaRAID/MegaCli/MegaCli64 -LdPdInfo -a0
Name : Virtual_Disk0
RAID Level : 1
State : Optimal
Number Of Drives : 2
Name : Virtual_Disk1
RAID Level : 5
State : Optimal
Number Of Drives : 6
Name : Virtual_Disk2
RAID Level : 0
State : Optimal
Number Of Drives : 2
我有另一个命令的第二个输出。
$ sudo /opt/MegaRAID/MegaCli/MegaCli64 -LdPdInfo -a0 \
> | xargs \
> | sed -r 's/(Slot Number:)(\s[0-9]+)/\2,/g' \
> | sed 's/(Target Id: .)/Physical Drives ids:/g'
Virtual Drive: 0 Physical Drives ids: 0, 1,
Virtual Drive: 1 Physical Drives ids: 2, 3, 4, 5, 6, 7,
Virtual Drive: 2 Physical Drives ids: 8, 9,
因此,我想合并2个输出。虚拟磁盘#末尾的数字必须与虚拟驱动器之后的第一个数字相匹配:#
所以,我希望它看起来像这样:
Name : Virtual_Disk0
RAID Level : 1
State : Optimal
Number Of Drives : 2
Virtual Drive: 0 Physical Drives ids: 0, 1,
Name : Virtual_Disk1
RAID Level : 5
State : Optimal
Number Of Drives : 6
Virtual Drive: 1 Physical Drives ids: 2, 3, 4, 5, 6, 7,
Name : Virtual_Disk2
RAID Level : 0
State : Optimal
Number Of Drives : 2
Virtual Drive: 2 Physical Drives ids: 8, 9,
条目始终匹配,并且它们的顺序相同。
我试过这个:
$ sudo /opt/MegaRAID/MegaCli/MegaCli64 -LdPdInfo -a0 ; \
> sudo /opt/MegaRAID/MegaCli/MegaCli64 -LdPdInfo -a0 | \
> xargs \
> | sed -r 's/(Slot Number:)(\s[0-9]+)/\2,/g' \
> | sed 's/(Target Id: .)/Physical Drives ids:/g'
Name : Virtual_Disk0
RAID Level : 1
State : Optimal
Number Of Drives : 2
Name : Virtual_Disk1
RAID Level : 5
State : Optimal
Number Of Drives : 6
Name : Virtual_Disk2
RAID Level : 0
State : Optimal
Number Of Drives : 2
Virtual Drive: 0 Physical Drives ids: 0, 1,
Virtual Drive: 1 Physical Drives ids: 2, 3, 4, 5, 6, 7,
Virtual Drive: 2 Physical Drives ids: 8, 9,
4条答案
按热度按时间nnt7mjpx1#
在我的环境中模拟
MegaCli64
输出:一个
awk
的想法:这产生:
在OP的实际环境中,他们会希望进行以下更改:
**注意:**我只是复制了OP提供的
MegaCli64
命令和输出;OP将需要验证这些命令和/或根据需要进行编辑bjp0bcyl2#
早上好。
在一行的末尾添加一个反斜杠来隐藏换行符并不会合并单独命令的输出,它只是一个很长的文本行,解析器仍然用分号将它们分隔为完全独立的操作。
正如Charles和艾德所指出的,您的第二个命令与第一个命令相同,不可能是正确的。我怀疑您的第二个命令(通过管道传输到xargs的命令)是复制/粘贴错误。请更正。
也就是说,有几个人已经建议使用
<(cmd1) <(cmd2)
结构,我也推荐使用它。作为另一个示例,由于我将您的输出保存到
file
和f2
中,因此我将使用一个非常冗余的UUoC来模拟<(...)
的-其输出
不过,
awk
解决方案更好,我最喜欢Cyrus简单优雅的sed
。编辑
如果您多次使用
bash
循环,只需确保您(重新)初始化ndx
。注意,这里可以使用here-strings而不是subshell:
suzh9iv83#
使用**ANY***
awk
( 假设两个输入都已在虚拟驱动器级别预先排序,并且两个文件都提供完美的1对1Map *):gdx19jrr4#
给定这些文件(特别注意没有前导空行...):
您可以在paragraph mode中使用awk,这样每个由
\n\n
分隔的块都是一条记录,每个由\n
分隔的行都是一个字段:图纸:
通过您的编辑,给定这些文件:
这个awk:
图纸: