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

时间:2018-02-01 09:40:51

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

我希望获得所有Status: (.*)行(而不是那些启动<something>Status: (.*)的行。我有follow命令将数据返回到数组中:

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将空格分隔的匹配返回到自己的密钥中?

1 个答案:

答案 0 :(得分:0)

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

cat tmp | grep -v "[[:alnum:]] Status:" | grep -w "Status:" | sed 's/    Status: //' >> file
  1. 使用grep过滤掉包含&#34; [任何字母数字字符]状态的行:&#34;
  2. 仅选择包含&#34;状态:&#34;
  3. 的那些
  4. 删除空格和状态:使用sed
  5. 使用awk,前缀行号
  6. 结果如下:

    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"
    

    您可以使用以下方法进行测试:

    for i in {0..3}; do
        echo "Key $i: ${array[$i]}"
    done
    

    返回:

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