Use sed
duas vezes, a segunda vez para substituir espaços por novas linhas:
mdadm --misc -sD | sed 's/ /=/'| sed 's/ /\n/g'
ou ligeiramente otimizado, apenas uma vez, mas com dois padrões:
mdadm --misc -sD | sed 's/ /=/;s/ /\n/g'
Estou tentando alterar o separador de registro, mas o awk não usa o separador de registro definido até o segundo registro e além.
Eu recebo uma saída assim:
ARRAY /dev/md4 level=raid1 num-devices=2 metadata=0.90 UUID=e85beb4f:84b05929:786a31c9:93e269d4
ARRAY /dev/md6 level=raid1 num-devices=2 metadata=0.90 UUID=4dbc659a:4d11f1be:6cbe4d26:c1372c53
ARRAY /dev/md5 level=raid1 num-devices=2 metadata=0.90 UUID=7d34fc96:1fa6c3c5:b9932435:ad126815
ARRAY /dev/md3 level=raid1 num-devices=2 metadata=0.90 UUID=862ae8d0:bd00b2fd:9e171b97:2937fc49
ARRAY /dev/md2 level=raid1 num-devices=2 metadata=0.90 UUID=03bb1b77:42d474f4:608c5276:cc04d84c
ARRAY /dev/md1 level=raid1 num-devices=2 metadata=0.90 UUID=6c14cddc:3ef74d2d:2f26fa3f:32cc274b
ARRAY /dev/md0 level=raid1 num-devices=2 metadata=0.90 UUID=76e50525:9ae71e74:9697a0e6:6f77e132
Eu preciso de uma saída assim:
ARRAY=/dev/md4
level=raid1
num-devices=2
metadata=0.90
UUID=e85beb4f:84b05929:786a31c9:93e269d4
ARRAY=/dev/md6
level=raid1
num-devices=2
metadata=0.90
UUID=4dbc659a:4d11f1be:6cbe4d26:c1372c53
ARRAY=/dev/md5
level=raid1
num-devices=2
metadata=0.90
UUID=7d34fc96:1fa6c3c5:b9932435:ad126815
ARRAY=/dev/md3
level=raid1
num-devices=2
metadata=0.90
UUID=862ae8d0:bd00b2fd:9e171b97:2937fc49
ARRAY=/dev/md2
level=raid1
num-devices=2
metadata=0.90
UUID=03bb1b77:42d474f4:608c5276:cc04d84c
ARRAY=/dev/md1
level=raid1
num-devices=2
metadata=0.90
UUID=6c14cddc:3ef74d2d:2f26fa3f:32cc274b
ARRAY=/dev/md0
level=raid1
num-devices=2
metadata=0.90
UUID=76e50525:9ae71e74:9697a0e6:6f77e132
Quando tento formatá-lo o awk não faz nada com o primeiro registro, mas depois formata corretamente o resto dos recors.
Aqui está o comando que estou usando com a saída:
$ mdadm --misc -sD |sed 's/ /=/' |awk '{RS=" "}{print $0}'
ARRAY=/dev/md4 level=raid1 num-devices=2 metadata=0.90 UUID=e85beb4f:84b05929:786a31c9:93e269d4
ARRAY=/dev/md6
level=raid1
num-devices=2
metadata=0.90
UUID=4dbc659a:4d11f1be:6cbe4d26:c1372c53
ARRAY=/dev/md5
level=raid1
num-devices=2
metadata=0.90
UUID=7d34fc96:1fa6c3c5:b9932435:ad126815
ARRAY=/dev/md3
level=raid1
num-devices=2
metadata=0.90
UUID=862ae8d0:bd00b2fd:9e171b97:2937fc49
ARRAY=/dev/md2
level=raid1
num-devices=2
metadata=0.90
UUID=03bb1b77:42d474f4:608c5276:cc04d84c
ARRAY=/dev/md1
level=raid1
num-devices=2
metadata=0.90
UUID=6c14cddc:3ef74d2d:2f26fa3f:32cc274b
ARRAY=/dev/md0
level=raid1
num-devices=2
metadata=0.90
UUID=76e50525:9ae71e74:9697a0e6:6f77e132
E eu não posso usar esse comando quando ele sai da matriz e preciso que mdadm --misc -sDY
Eu também prefiro a solução somente sed dada por @SvW, mas responda sua pergunta:
O RS=" "
chega tarde demais. É definido após a primeira linha ser lida. Você deve chamá-lo em um bloco BEGIN, por exemplo, para ter um efeito também para a primeira linha:
mdadm --misc -sD | sed 's/ /=/' | awk 'BEGIN{RS=" "}{print $0}'
Edit: Ok, @Thor foi mais rápido. :)
Sua solução não funciona porque RS
está definido muito tarde no processo. Configure-o antes que awk
receba qualquer entrada e funcione corretamente:
mdadm --misc -sD | sed 's/ /=/' | awk '{print $0}' RS=' '
Talvez a seguinte resposta apenas para o awk também seja útil:
mdadm --misc -sD | awk '{$2=$1"="$2; $1=""} 1' OFS='\n'
Tags awk linux software-raid