我有以下命令的一堆输出:
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
对此最好的解决方法是什么?
答案 0 :(得分:2)
纯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 :(得分:1)
您可以通过以下方式使用csplit
(POSIX):
csplit -z your_file /Mirror/ {*}
此处,z
是--elide-empty-files
的缩写,{*}
是尽可能多次重复上一个模式。
如果行数固定(在您的情况下 9 ),您可以使用split
执行此操作:
split -l9 your_file
在这两种情况下,如果要将每个文件的内容保存在数组中,可以这样做:
i=0 IFS=
for mirror in <prefix>*; do array[((i++))]=$(cat $mirror); done
用您选择的前缀或默认值替换<prefix>
。
csplit
$ cat your_file
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
$ csplit -z your_file /Mirror/ {*}
166
166
$ ls -1
xx00
xx01
your_file
$ i=0 IFS=
$ for mirror in xx*; do array[((i++))]=$(cat $mirror); done
$ 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