Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Bash-按每个镜像处理metastat数据_Arrays_Bash - Fatal编程技术网

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

好了,哇。非常智能的脚本。先生,你是一位绅士和圣人。