我试图解析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将空格分隔的匹配返回到自己的密钥中?
答案 0 :(得分:0)
它不是一个非常便携的解决方案,但它适用于您提供的示例:
cat tmp | grep -v "[[:alnum:]] Status:" | grep -w "Status:" | sed 's/ Status: //' >> file
grep
过滤掉包含&#34; [任何字母数字字符]状态的行:&#34; 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"
您可以使用以下方法进行测试:
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