bash+sed-返回与数组的匹配,空格有问题

bash+sed-返回与数组的匹配,空格有问题,bash,sed,Bash,Sed,我试图解析HP RAID控制器的输出,该控制器返回如下内容: Array 1: Size: 100GB Status: OK Caching: Enabled OS Status: LOCKED Label: asdfasdf Array 2: Size: 100GB Status: OK Caching: Enabled OS Status: LOCKED Label: asdfasdf Array 3:

我试图解析HP RAID控制器的输出,该控制器返回如下内容:

Array 1:
    Size: 100GB
    Status: OK
    Caching: Enabled
    OS Status: LOCKED
    Label: asdfasdf
Array 2:
    Size: 100GB
    Status: OK
    Caching: Enabled
    OS Status: LOCKED
    Label: asdfasdf
Array 3:
    Size: 300GB
    Status: OK
    Caching: Enabled
    OS Status: LOCKED
    Label: asdfasdf
Array 4:
    Size: 150GB
    Status: Interim Recovery Mode
    Caching: Enabled
    OS Status: LOCKED
    Label: asdfasdf
我要获取所有状态:*行,而不是开始状态:*的行。我使用以下命令将数据返回到数组中:

array=( `sed -n 's/^[[:space:]]*Status:[[:space:]]\([a-zA-Z ]*\)$/\1/p' raid.txt` )    
echo "${array[0]}|${array[1]}|${array[2]}|${array[3]}|${array[4]}|${array[5]}"
num=1
for i in ${array[@]}
do
    echo "${num} ${i}"
    num=$(expr $num + 1)
done
这将返回输出:

OK|OK|OK|Interim|Recovery|Mode
1 OK
2 OK
3 OK
4 Interim
5 Recovery
6 Mode
如您所见,与空格的匹配被分解为3个单独的数组键,而它应该只占用一个


我认为sed命令是我的问题,因为我回显单个数组键的测试显示它们在该点被拆分。有人能建议如何让sed将空格分隔的匹配返回到自己的密钥中吗?

这不是一个非常便携的解决方案,但它适用于您提供的示例:

cat tmp | grep -v "[[:alnum:]] Status:" | grep -w "Status:" | sed 's/    Status: //' >> file
使用grep可以过滤掉包含[任何字母数字字符]状态的行: 仅选择包含以下状态的项: 删除空白和状态:带sed 使用awk,预先输入行号 结果如下:

1  OK
2  OK
3  OK
4  Interim Recovery Mode
如果您要做的唯一一件事是让阵列的每个键具有一个状态:

declare -a array
c=0
while IFS='' read -r line || [[ -n "$line" ]]; do
    array+=("$line")
    c=$((c+1))
done < "inuptFile"
返回:

Key 0: OK
Key 1: OK
Key 2: OK
Key 3: Interim Recovery Mode

为什么带空格的匹配只占一个?因为它是一个状态行,所以是一个字符串。我想检查每个块的每个状态的输出。只是从你写的脚本来看,我不明白你为什么期望不同的输出。我可以想出很多方法来做到这一点,但是为了节省时间,你可以用下划线代替空格,谢谢-还有其他*状态:OK行,例如控制器状态,但我可能可以通过一些研究将它们全部过滤掉。但是,如果sed只是将整个字符串返回到数组位置,这将是理想的!我刚刚对它进行了测试,似乎是对阵列的扩展导致了问题。按如下方式使用代码array=cat raid.txt | grep-v[[:alnum:]状态:| grep-w状态:| sed's/Status://'我仍然得到6个数组键,而不是4个。我使用了你的混合代码来适应我的情况,但IFS是我丢失的关键
Key 0: OK
Key 1: OK
Key 2: OK
Key 3: Interim Recovery Mode