awk ignora o separador de registro que eu configurei para o primeiro registro

2

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

    
por menders65 13.03.2014 / 08:34

3 respostas

3

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'
    
por 13.03.2014 / 08:41
4

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. :)

    
por 13.03.2014 / 10:02
1

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'
    
por 13.03.2014 / 10:00