awk 忽略我为第一条记录设置的记录分隔符

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

答案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'

相关内容