我正在尝试更改记录分隔符,但是 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
答案1
使用sed
两次,第二次用换行符替换空格:
mdadm --misc -sD | sed 's/ /=/'| sed 's/ /\n/g'
或者稍微优化一下,只优化一次,但采用两种模式:
mdadm --misc -sD | sed 's/ /=/;s/ /\n/g'
答案2
我也更喜欢@SvW 给出的 sed-only 解决方案,但回答你的问题:
来得RS=" "
太晚了。它是在读完第一行后设置的。例如,你应该在 BEGIN 块中调用它,这样第一行也会生效:
mdadm --misc -sD | sed 's/ /=/' | awk 'BEGIN{RS=" "}{print $0}'
编辑:好的,@Thor 更快。:)
答案3
您的解决方案不起作用,因为RS
在过程中设置得太晚了。在awk
收到任何输入之前设置它,它就可以正常工作:
mdadm --misc -sD | sed 's/ /=/' | awk '{print $0}' RS=' '
也许以下仅 awk 的答案也很有用:
mdadm --misc -sD | awk '{$2=$1"="$2; $1=""} 1' OFS='\n'