合并多行命令输出

时间:2017-09-15 18:00:54

标签: linux bash shell grep formatting

我正在尝试将命令输出合并为一行,以便打印输出以显示计算机名称,装载和“在线”状态。

这是输出的输出方式:

Status of volume: mymount
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick mymachine01:/bricks/mymount/mylongcha
achtermnt                                   49156     0          Y       6648
Brick mymachine02:/bricks/mymount/mylongcha
achtermnt                                   49156     0          Y       6484

当我执行命令并使用常规| grep -i brick时,我得到了这个

Brick mymachine01:/bricks/mymount/mylongcha
Brick mymachine02:/bricks/mymount/mylongcha

其中没有显示我需要的任何其他数据,例如“在线”。我怀疑这种情况正在发生,因为grep只查找匹配的行,并且查看第一个输出,由于下一行中挂载点的实际结束之后的数据,该行在“字段”部分下是空白的。

有没有办法合并这两行,因为我需要发布状态和PID挂载点的数据?

输出应如下所示:

Brick mymachine01:/bricks/mymount/mylongchaachtermnt    49156     0     Y      6448
Brick mymachine02:/bricks/mymount/mylongcharahtermnt    49156     0     Y      6484

每一行都在一行上。我将在脚本中的每一行前面添加一个时间戳,但这只是偏好。

2 个答案:

答案 0 :(得分:0)

有:... | grep -i -A1 brick | paste -d "" - -

答案 1 :(得分:0)

我最终得到了这个剧本:

#!/bin/bash


mapfile -t HOST < <( gluster volume status all detail | grep brick | awk '{ print $4 }' | grep -oP "myHost\d+" )
mapfile -t MNT  < <( gluster volume status all detail | grep brick | awk '{ print $4 }' | grep -oP "\/bricks.+" )
mapfile -t STATUS < <( gluster volume status all detail | grep -i online  | awk '{ print $3 }' )

i=0;
for item in "${HOST[@]}"; do
   echo ${HOST[$i]} ${MNT[$i]} ${STATUS[$i]};
   let "i=i+1"
done

这有我的输出,每个数组都打印在具有状态的单个列中。

我还必须使用不同的gluster命令,它会在一行中输出完整的挂载。