Bash - 每个镜像处理转移数据

时间:2014-12-02 13:51:28

标签: 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: 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

对此最好的解决方法是什么?

2 个答案:

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