Назад | Перейти на главную страницу

awk игнорирует разделитель записей, который я установил для первой записи

Я пытаюсь изменить разделитель записей, но awk не использует заданный мной разделитель записей до второй записи и далее.

Я получаю такой вывод:

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

Мне нужен такой вывод:

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

Когда я пытаюсь отформатировать его, awk ничего не делает с первой записью, но затем правильно форматирует остальные записи.

Вот команда, которую я использую для вывода:

$ 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

И я не могу использовать эту команду, так как она удаляется из массива, а мне это нужно mdadm --misc -sDY

Я также предпочел бы решение только для sed, данное @SvW, но чтобы ответить на ваш вопрос:

В RS=" " приходит слишком поздно. Устанавливается после чтения первой строки. Вы должны вызвать его в блоке BEGIN, например, чтобы он повлиял также на первую строку:

mdadm --misc -sD | sed 's/ /=/' | awk 'BEGIN{RS=" "}{print $0}'

Изменить: Хорошо, @Thor был быстрее. :)

Использовать sed дважды, второй раз заменить пробелы на новые строки:

mdadm --misc -sD | sed 's/ /=/'| sed 's/ /\n/g'

или немного оптимизирован, только один раз, но с двумя шаблонами:

mdadm --misc -sD | sed 's/ /=/;s/ /\n/g'

Ваше решение не работает, потому что RS устанавливается слишком поздно в процессе. Установите это раньше awk получает любой ввод и работает правильно:

mdadm --misc -sD | sed 's/ /=/' | awk '{print $0}' RS=' '

Возможно, следующий ответ только для awk также будет полезен:

mdadm --misc -sD | awk '{$2=$1"="$2; $1=""} 1' OFS='\n'