Arrays Bash-按每个镜像处理metastat数据
我有以下命令的一系列输出:Arrays Bash-按每个镜像处理metastat数据,arrays,bash,Arrays,Bash,我有以下命令的一系列输出: metastat |egrep 'Submirror|State|d' |egrep -v 'Read|Write|c|Reloc' 输出如下所示: d15: Mirror Submirror 0: d16 State: Okay Submirror 1: d17 State: Okay d16: Submirror of d15 State: Okay d17: Submirror of d15 State
metastat |egrep 'Submirror|State|d' |egrep -v 'Read|Write|c|Reloc'
输出如下所示:
d15: Mirror
Submirror 0: d16
State: Okay
Submirror 1: d17
State: Okay
d16: Submirror of d15
State: Okay
d17: Submirror of d15
State: Okay
d25: Mirror
Submirror 0: d26
State: Okay
Submirror 1: d27
State: Okay
d26: Submirror of d25
State: Okay
d27: Submirror of d25
State: Okay
等等
我想将每个镜像集放入一个数组中
例如:
echo ${array[0]}
d15: Mirror
Submirror 0: d16
State: Okay
Submirror 1: d17
State: Okay
d16: Submirror of d15
State: Okay
d17: Submirror of d15
State: Okay
echo ${array[1]}
d25: Mirror
Submirror 0: d26
State: Okay
Submirror 1: d27
State: Okay
d26: Submirror of d25
State: Okay
d27: Submirror of d25
State: Okay
这方面的最佳解决方案是什么?您可以通过以下方式使用(POSIX):
csplit -z your_file /Mirror/ {*}
i=0 IFS=
for mirror in <prefix>*; do array[((i++))]=$(cat $mirror); done
这里,z
是--elide空文件
的缩写,{*}
是尽可能多地重复前面的模式
如果行数是固定的(9,在您的情况下),您可以使用:
在这两种情况下,如果要将每个文件的内容保存在数组中,可以通过以下方式执行:
csplit -z your_file /Mirror/ {*}
i=0 IFS=
for mirror in <prefix>*; do array[((i++))]=$(cat $mirror); done
纯
bash
解决方案:
declare -a MIRROR_ARR
COUNT=-1
IFS=''
while read -r line
do
if [[ "$line" =~ Mirror ]]; then
COUNT=$(( $COUNT + 1 ))
MIRROR_ARR[$COUNT]=$line
else
MIRROR_ARR[$COUNT]=$(printf '%s\n%s' "${MIRROR_ARR[$COUNT]}" "$line")
fi
done < <(metastat |egrep 'Submirror|State|d' |egrep -v 'Read|Write|c|Reloc')
echo "${MIRROR_ARR[0]}"
echo "----"
echo "${MIRROR_ARR[1]}"
声明-镜像
计数=-1
如果=“”
而read-r行
做
如果[[“$line”=~Mirror]];然后
计数=$($COUNT+1))
镜像ARR[$COUNT]=$line
其他的
镜像ARR[$COUNT]=$(printf'%s\n%s'${MIRROR\u ARR[$COUNT]}'“$行”)
fi
好了,哇。非常智能的脚本。先生,你是一位绅士和圣人。