bash+sed-返回与数组的匹配,空格有问题
我试图解析HP RAID控制器的输出,该控制器返回如下内容: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:
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